iPhoneの共有メニューからWebアプリを開く——ショートカットで「コピーして貼り付け」をなくす

シンプル経路比較 という小さなツールを作りました。乗換案内アプリで経路を共有してテキストをコピーし、貼り付けると、複数の経路を横並びで比べられる——それだけの道具です。

作ってみて、自分でも毎日のように使うようになりました。ただ、使っているうちに一つだけ引っかかることが出てきます。毎回「共有」→「コピー」→アプリを開く→「貼り付け」の四手が必要なのです。一回あたりは数秒でも、経路を三つ比べようとすれば三回繰り返すことになります。

共有メニューを開いたその場で、直接このツールに渡せたら早いのに——と思ったのが今回の出発点でした。

前提:Webアプリは共有メニューに並べない

まず結論から書くと、Webアプリを共有メニューに直接並べる方法は、iPhoneにはありません

共有メニューに自分のアイコンを出すには「共有拡張(Share Extension)」という仕組みが必要で、これはApp Storeから入れるアプリだけが持てるものです。Androidであれば Web Share Target という仕組みでWebアプリも共有先になれるのですが、これはiPhoneのSafariでは使えません。

つまり、正面から解決する道はありません。しかし迂回する道が一つだけあります。「ショートカット」アプリです。

ショートカットは共有メニューに並べる

「ショートカット」は、iPhoneに最初から入っている自動化アプリです。作ったショートカットには「共有シートに表示」という設定があり、これをオンにするとそのショートカットが共有メニューに並びます

そして、ショートカットは受け取ったテキストを加工して、任意のURLを開けます。ここまで揃えば、やることは決まりました。

  1. 共有されたテキストを受け取る
  2. URLに載せられる形に変換する
  3. https://(Webアプリのアドレス)/#text=(変換したテキスト) を開く
  4. Webアプリ側は、開かれたURLからテキストを取り出して表示する

共有メニューに並ぶのはショートカットですが、その先はまっすぐWebアプリにつながります。ワンタップで、コピーも貼り付けもなくなりました。

入手する

作ったショートカットを公開しました。iPhoneかiPadで開くと、そのまま追加できます。

ショートカット「経路比較に追加」を入手

追加したあと、「ショートカット」アプリでⓘを開き、「共有シートに表示」がオンになっていることだけご確認ください。同じものはアプリの画面内からも入手できます。

自分で作る場合(2分ほど)

中身は単純なので、ご自分で作ることもできます。作るのは一度だけです。

  1. 「ショートカット」アプリを開き、右上の「+」で新規作成します
  2. アクション「テキストをURLエンコード」を追加し、入力に「ショートカットの入力」を選びます
  3. アクション「テキスト」を追加し、https://keiro.yohakulab.app/#text= と入力してから、その直後に手順2の結果(変数)を挿入します
  4. アクション「URLを開く」を追加し、手順3の「テキスト」を渡します
  5. 上部の「ⓘ」から「共有シートに表示」をオンにし、受け取る種類を「テキスト」だけにします
  6. 「経路比較に追加」など好きな名前を付けて保存します

手順3で「テキスト」アクションを挟んでいるのがポイントです。「URLを開く」のURL欄には、決まった文字列と変数を並べて入れることができませんでした。そこで、いったん「テキスト」で文字列をつなげてから、その結果を「URLを開く」に渡しています。

これで、乗換案内アプリの共有メニューに「経路比較に追加」が並びます。選べば、経路が追加された状態でツールが開きます。

ハマったところ:+ が消える

ここからは、うまくいかなかった話です。

手順どおりに作ってみたところ、ツールは開くのに、経路が何も追加されないという状態になりました。ショートカット側でエンコード結果を確認しても、%E4%B8%AD... という見慣れた形式で、おかしなところはありません。

原因は、受け取る側にありました。URLからテキストを取り出すのに、ブラウザに標準で用意されている仕組み(URLSearchParams)を使っていたのですが、これがショートカットのエンコード結果と噛み合っていなかったのです。

iPhoneの「テキストをURLエンコード」は、Appleの標準的な実装をそのまま使っているようで、+&= をエスケープせずに残します。一方 URLSearchParams は、URLの問い合わせ部分の作法にのっとって + を空白として読み、& を区切り文字として扱います。結果として、

という壊れ方をしていました。どちらも、パッと見ではまず気づけません。

直し方は単純で、URLSearchParams を使わず、# 以降を自分で取り出して復元するようにしました。標準の仕組みが常に正解とは限らない、というのが今回の教訓です。「よくできた仕組み」は、それが想定している作法の中でだけ正しいのだと、あらためて思いました。

「#」を使ったのには理由がある

もう一つ、地味ですが大事にした点があります。テキストを載せる場所を、?text= ではなく #text= にしたことです。

URLの # から後ろ(フラグメント)は、サーバーには送信されません。ブラウザの中だけで扱われる部分です。一方 ? から後ろはサーバーに送られ、アクセスの記録に残ることがあります。

このツールは「貼り付けた内容は端末内でのみ処理し、どこにも送信しない」ことを約束にしています。共有シート対応で経路がURLに載るようになった以上、その約束を崩さない置き場所を選ぶ必要がありました。加えて、取り込みが終わった時点でURLからテキストを消しているので、履歴にも残りません。

便利さを足すときに、もともとの約束を黙って薄めてしまわないこと。小さな道具ほど、ここが信用の全部だと思っています。

おわりに

Webアプリは、ネイティブアプリにできることの全部はできません。共有メニューに並べないのも、その一つです。それでも、すでに手元にある仕組みを一つ挟むだけで、体感はかなりネイティブに近づきます

App Storeに出さなくても、アカウント登録を求めなくても、日々の四手を一手にすることはできる——今回いちばん嬉しかったのは、その手応えでした。

← 記事一覧へ