iOS ショートカット用に API を作る

Posted on
Productivity Notion

Notion に買い物リストというデータベースを作って買わないといけないものなどをそこで一括して管理してる。 そこには日用品からそうではないものまでとにかく買いたいと思ったもの・買うと決めたものを入れてる。

しかしこのデータベースの運用には少し課題があり、特に日用品は「あ、シャンプーの詰め替えがなくなったな、買っておこう」と思っても実際にこのデータベースにページを作るまでに忘れて思い出すことが必要になってしまうことがよくあった。

買いたいと思ったとき手元にスマホがないので取りに行く間になにか別のことをすると忘れてしまうのだが、それ以外にもスマホのロックを解除してNotionを起動して…とやっている間に忘れてしまうことがあった。 ロック解除、Notion起動、買い物リストのデータベースへ遷移(2タップ)、新規ページ作成、とタップ数が多いので忘れてしまうことがある。

理想としてはアイコンをタップしたらテキストフィールドにフォーカスがあたっていて、入力したらそれだけでページが作られるくらい簡単になるといい。

これを実現するために iOS のショートカットとそれ用に API を作った。

API サーバー

ショートカットから Notion の API を直接呼び出すことも可能ではあると思うが、UI でリクエストボディの JSON を作るのが面倒だったので間に自作の API サーバーを挟むことにした。

API がやることは非常に単純で、いくつかのパラメータがついてくるのでそれを基に Notion の API を叩くだけである。

ショートカット側に色々持つのが面倒なのと API トークンはサーバーで持っておきたいのでショートカットと API の間はまた別の識別子を使っている。 その識別子がページ作成先のデータベースなどの情報と紐付いているといった作りになっている。

ショートカット

今までショートカットを使ったことがなかったのだが、使ってみると結構便利である。

今回は理想とするフローを再現することができた。

UI で一連の流れを作れるので誰でも触れるというメリットはある。 しかしソフトウェアを作ることに慣れている人の場合はショートカットをコードで表現したくなるかもしれない。 UI で一つずつパーツを組み合わせたり変数を利用したりするのが面倒なのである。

なのでこの部分を簡単にするために API サーバーを用意しているとも言える。

ショートカットの HTTP クライアント

自宅のクラスタで動かしているサービスの類は基本的にすべてプロキシの後ろに隠してあり、ほぼすべてが認証を通るようになっている。(一部例外はある)

しかしショートカット内蔵の HTTP クライアントでは残念ながらこの認証を通ることができない。

プロキシの認証を通るには OpenID Connect で認証しプロキシ自体のクッキーを食うか、クライアント証明書認証が必要である。

ショートカットのワークフローではクッキーを食べることはできないし、当然 Safari とその部分は共有されていない。 またクライアント証明書も提出することはできないようである。

プロキシのクライアント証明書認証は TLS のハンドシェイク時に提出を求める証明書の Issuer の Fingerprint をクライアントに送るようになっている。 なので場合によってはクライアント証明書を一意に決定することができ、ユーザーに選択させる必要がないという状況を作ることはできるのだが、ショートカットの HTTP クライアントはそういう状況であったとしてもクライアント証明書を提出してこなかった。

これは実際に試す前から予想できた挙動ではある。

ひとまず現在は API サーバーの場合はプロキシの認証を切っているが、いずれ認証付きで API リクエストを発行できるようにしたい。