iPhoneの共有メニューからWebアプリを開く——ショートカットで「コピーして貼り付け」をなくす
シンプル経路比較 という小さなツールを作りました。乗換案内アプリで経路を共有してテキストをコピーし、貼り付けると、複数の経路を横並びで比べられる——それだけの道具です。
作ってみて、自分でも毎日のように使うようになりました。ただ、使っているうちに一つだけ引っかかることが出てきます。毎回「共有」→「コピー」→アプリを開く→「貼り付け」の四手が必要なのです。一回あたりは数秒でも、経路を三つ比べようとすれば三回繰り返すことになります。
共有メニューを開いたその場で、直接このツールに渡せたら早いのに——と思ったのが今回の出発点でした。
前提:Webアプリは共有メニューに並べない
まず結論から書くと、Webアプリを共有メニューに直接並べる方法は、iPhoneにはありません。
共有メニューに自分のアイコンを出すには「共有拡張(Share Extension)」という仕組みが必要で、これはApp Storeから入れるアプリだけが持てるものです。Androidであれば Web Share Target という仕組みでWebアプリも共有先になれるのですが、これはiPhoneのSafariでは使えません。
つまり、正面から解決する道はありません。しかし迂回する道が一つだけあります。「ショートカット」アプリです。
ショートカットは共有メニューに並べる
「ショートカット」は、iPhoneに最初から入っている自動化アプリです。作ったショートカットには「共有シートに表示」という設定があり、これをオンにするとそのショートカットが共有メニューに並びます。
そして、ショートカットは受け取ったテキストを加工して、任意のURLを開けます。ここまで揃えば、やることは決まりました。
- 共有されたテキストを受け取る
- URLに載せられる形に変換する
https://(Webアプリのアドレス)/#text=(変換したテキスト)を開く- Webアプリ側は、開かれたURLからテキストを取り出して表示する
共有メニューに並ぶのはショートカットですが、その先はまっすぐWebアプリにつながります。ワンタップで、コピーも貼り付けもなくなりました。
入手する
作ったショートカットを公開しました。iPhoneかiPadで開くと、そのまま追加できます。
追加したあと、「ショートカット」アプリでⓘを開き、「共有シートに表示」がオンになっていることだけご確認ください。同じものはアプリの画面内からも入手できます。
自分で作る場合(2分ほど)
中身は単純なので、ご自分で作ることもできます。作るのは一度だけです。
- 「ショートカット」アプリを開き、右上の「+」で新規作成します
- アクション「テキストをURLエンコード」を追加し、入力に「ショートカットの入力」を選びます
- アクション「テキスト」を追加し、
https://keiro.yohakulab.app/#text=と入力してから、その直後に手順2の結果(変数)を挿入します - アクション「URLを開く」を追加し、手順3の「テキスト」を渡します
- 上部の「ⓘ」から「共有シートに表示」をオンにし、受け取る種類を「テキスト」だけにします
- 「経路比較に追加」など好きな名前を付けて保存します
手順3で「テキスト」アクションを挟んでいるのがポイントです。「URLを開く」のURL欄には、決まった文字列と変数を並べて入れることができませんでした。そこで、いったん「テキスト」で文字列をつなげてから、その結果を「URLを開く」に渡しています。
これで、乗換案内アプリの共有メニューに「経路比較に追加」が並びます。選べば、経路が追加された状態でツールが開きます。
ハマったところ:+ が消える
ここからは、うまくいかなかった話です。
手順どおりに作ってみたところ、ツールは開くのに、経路が何も追加されないという状態になりました。ショートカット側でエンコード結果を確認しても、%E4%B8%AD... という見慣れた形式で、おかしなところはありません。
原因は、受け取る側にありました。URLからテキストを取り出すのに、ブラウザに標準で用意されている仕組み(URLSearchParams)を使っていたのですが、これがショートカットのエンコード結果と噛み合っていなかったのです。
iPhoneの「テキストをURLエンコード」は、Appleの標準的な実装をそのまま使っているようで、+ や & や = をエスケープせずに残します。一方 URLSearchParams は、URLの問い合わせ部分の作法にのっとって + を空白として読み、& を区切り文字として扱います。結果として、
- 共有テキストに含まれる
定期代+253円の+が空白に化ける &があると、そこでテキストが切れる
という壊れ方をしていました。どちらも、パッと見ではまず気づけません。
直し方は単純で、URLSearchParams を使わず、# 以降を自分で取り出して復元するようにしました。標準の仕組みが常に正解とは限らない、というのが今回の教訓です。「よくできた仕組み」は、それが想定している作法の中でだけ正しいのだと、あらためて思いました。
「#」を使ったのには理由がある
もう一つ、地味ですが大事にした点があります。テキストを載せる場所を、?text= ではなく #text= にしたことです。
URLの # から後ろ(フラグメント)は、サーバーには送信されません。ブラウザの中だけで扱われる部分です。一方 ? から後ろはサーバーに送られ、アクセスの記録に残ることがあります。
このツールは「貼り付けた内容は端末内でのみ処理し、どこにも送信しない」ことを約束にしています。共有シート対応で経路がURLに載るようになった以上、その約束を崩さない置き場所を選ぶ必要がありました。加えて、取り込みが終わった時点でURLからテキストを消しているので、履歴にも残りません。
便利さを足すときに、もともとの約束を黙って薄めてしまわないこと。小さな道具ほど、ここが信用の全部だと思っています。
おわりに
Webアプリは、ネイティブアプリにできることの全部はできません。共有メニューに並べないのも、その一つです。それでも、すでに手元にある仕組みを一つ挟むだけで、体感はかなりネイティブに近づきます。
App Storeに出さなくても、アカウント登録を求めなくても、日々の四手を一手にすることはできる——今回いちばん嬉しかったのは、その手応えでした。