u

Web Share Target API を使って共有メニューからスクマするアプリを作った

via https://uknmr.github.io/scma/

Scrapbox でブックマーク することをスクマと呼ぶらしい。私は脳の外部記憶装置として Scrapbox を使っていて、先月には Pocket も Feedly Boards も使うのをやめ Scrapbox に一本化したところだった。

ブックマークレットでスクマに流し込んでいたが、その操作ステップの多さにストレスが溜まっていた。例えば Feedly で RSS を閲覧しているとすると、

  • Feedly の詳細ページを最下部までスクロール
  • Visit Website でウェブビューを開く
  • Chrome で開く
  • アドレスバーに「す」と打ち込みブックマークレット呼び出し

という具合だった。これが、

  • 共有メニューからアプリ選択
  • テキストを入力して送信

となる。正直ブックマークレットの方ができることは多いが、操作ステップは減るので良しとしたい。

使い方

Android Chrome で使う想定です。デスクトップなら scboloo を使えばいいと思います。

  • https://uknmr.github.io/scma/ を開く
  • A2HS する
  • スクマしたいウェブページで共有メニューから「スクマ」を選択する
  • PWA が立ち上がるので適当に入力して送信する

Web Share Target API

Chrome 71 から Web Share Target API が使えるようになった。これは Android で言うところの Intent.ACTION_SEND をウェブで簡単に受け取れるようになるものだ。いまのところ Chrome でしか動作しないが、いいものなので他のプラットフォームにも早く来るといい。

実装はほとんどいらず、Web App Manifestshare_target を書くだけだった。

"share_target": {
"action": "/share-target/",
"method": "GET",
"enctype": "application/x-www-form-urlencoded",
"params": {
"title": "title",
"text": "text",
"url": "url"
}
}

action に対して methodparams が渡って来るので、アプリ側ではそれをよしなに処理してあげれば良い。ちなみに methodenctype を省略するとそれぞれ GETapplication/x-www-form-urlencoded になる(省略すると DevTools の警告がうるさい)。

titletexturl の 3 つフィールドはあるが、それぞれの内容は共有する側のアプリに依存し、受け取り側では操作できない。また Android においては url はサポートされていないらしい。

その他やってみたこと

基本的に自分しか使わないものなので自由に開発できてよかった。

  • ES Modules のブラウザ対応が進んでいたので使ってみた
  • border-radius に 8 つの半径を指定して有機的な形を作ってみた
  • unicode-range を指定してみた(ただ指定してみたかっただけで利いてるわけではない)

できなかったこと

API が公開されていなかったり CORS に阻まれできなかったこと。

ここはなんとか実現したくて Firebase Functions で puppeteer を動かしてレスポンスを返す実装を書いた。が、毎回認証が走っててアホくさなったので消した。

余談

最初はなぜか Flutter を使って実装を始め「Widget 完全に理解した」となり Intent.ACTION_SEND を捌く Java コードを書いていた。"共有でサクッとスクマしたいだけなんだよおおおおお" とか "Flutter が楽とか言って結局ネイティブモジュール書かないと駄目じゃんかよおおおお"、となってたので Web Share Target API のことを思い出せてよかった。

あと Paul Kinlan 氏の紹介記事の日本語が怪しいので余裕があればここに PR を投げたい。