プレフィックスを付けて電話をかける iOS ショートカット

#成果物
[RoutineHub • Call with Prefix][link-1]
[こちら](http://myu65.hatenablog.com/entry/2016/12/01/013318)を参考にして作りました。
[link-1]:https://routinehub.co/shortcut/538

#手短に
連絡先やクリップボード中の番号に、または共有メニューで共有した番号にプレフィックスを付けて電話をかけられます。

#背景
[みおふぉんダイアル](https://www.iijmio.jp/hdd/miofone/dial.jsp)やら[楽天でんわ](https://denwa.rakuten.co.jp/)やら、通話料を節約できるサービスがありますが、利用するにはサービスごとに決められたプレフィックス番号を電話番号の頭につけて発信する必要があります。公式アプリから発信すればそれを自動でやってくれます。

しかし iOS では OS の仕様で公式アプリから着信履歴を見られません。履歴の番号にプレフィックスをつけて折り返し電話しようとすると、番号を履歴からアプリにコピペせねばなりません。またメールや Web ページ上の番号に発信したいときも、同様にアプリにコピペしないといけません。

これは面倒なので、iOS 12 から備わったショートカット App でこれを簡単にしてみました。
[LINE Out](https://line.me/ja/call) も電話番号をコピペできなくて不便なので、応用としてこちらに番号を渡す[ショートカット](https://routinehub.co/shortcut/3512)も作りました。

#導入手順

1. ショートカット App を App Store から[インストール](https://itunes.apple.com/jp/app/id915249334?mt=8)。

1. Call with Prefix ショートカットを[ダウンロード][link-1]。

1. 利用したいプレフィックス番号を登録。デフォルトで Biglobe でんわのプレフィックスが入っています。

1. 電話したい国の[国際電話コード](https://ja.wikipedia.org/wiki/国際電話番号の一覧)を登録。日本国内に電話したい方はデフォルトの 0 のままでいいです。

プレフィックスと国際電話コードは後で変更することもできます。
ショートカット App 上の Call with Prefix アイコン右上の 3 点ボタンをタップして
![マイショートカット画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/4c75c94b-6054-6dad-fa02-75cde99e3c2a.jpeg)

さらにショートカット編集画面でもタイトル右の 3 点ボタンをタップ
![ショートカット編集画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/861a29f1-fb8f-6b2e-670e-ff12a7668ec9.jpeg)

「ショートカットをカスタマイズ…」を選んでください。
![ショートカット設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/ce14027e-cf8d-1223-c77e-b20e17471564.jpeg)

#使用方法

##共有メニュー (Action Extention) 経由

連絡先や着信履歴の番号、Web ページ上の電話番号などを共有し、メニューからショートカット App を選びます。さらに Call with Prefix を選べばその番号にプレフィックス付きで発信できます。

##直接起動

ショートカット App やそのウィジェットから Call with Prefix を起動すると、連絡先やクリップボードから電話番号を取得したり、直接入力したりできます。上と同様、その番号にプレフィックス付きで発信できます。

#アップデートを受け取るには

[UpdateHub][link-2] に対応しています。このショートカットも一緒にダウンロードしておいていただくと、Call with Prefix のアップデートを受け取ることができます。
[link-2]:https://routinehub.co/shortcut/2066

UpdateHub を手動で起動するか Call with Prefix を直接起動して "Check for updates" を選んでいただければ、アップデートがないか確認が走ります。

なお Call with Prefix は、ショートカットを共有するストアのような [RoutineHub](https://routinehub.co/) なるサイトにアップロードしています。[ライフハッカーで紹介されていたもの](https://www.lifehacker.jp/2018/10/keep-your-your-favorite-ios-shortcuts-up-to-date-with-r.html)です。アップデート通知にはこのサイトの機能が利用されています。

#解説

見ていただければおわかりいただけるかと思いますが~~これがないと Qiita っぽくならないので~~簡単に。
電話番号を取得してくる前半パートと電話をかける後半パートに分かれています。
（一部スクリーンショットは旧バージョンのものになっていますが、動きをご覧いただくのに支障はありません。）

##前半 - 電話番号を取得する

コメントと辞書でメタデータを記載しています。
コメントは上の UpdateHub でのアップデートフェッチに必要な情報も含んでいます。
![メタデータ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/dcc37af2-9ed3-8426-7087-10a3d6a3f9d2.jpeg)

ショートカットの入力に何か見つかった場合 Action Extension 経由の起動と判断し、その電話番号を取得して後半に渡しています。
![ショートカットの入力有無確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/3500c392-4ff3-6912-694b-463530fd0a0b.jpeg)

そうでない場合はショートカット App またはウィジェットからの起動と判断して
![そうでない場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/9b2047ba-49c7-c0e5-985d-de5c2f22f1a8.jpeg)

まずクリップボードに電話番号があるかを調べます。あった場合は
![クリップボード中の電話番号有無確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/a1870ad5-45ea-31a7-fcbd-78f655bcf1fd.jpeg)

クリップボードも含めてどこから電話番号を取得するか、またはアップデートの有無を確認するか尋ねます。プロンプトの文章は予め用意していたものを[マジック変数](https://support.apple.com/ja-jp/guide/shortcuts/apdd2b316022/ios)で呼び出しています。
ユーザーの回答は変数に格納しています。
![ユーザーによる選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/49706743-57d2-290a-0cb6-450b73515a64.jpeg)

クリップボードに電話番号がなかった場合、それ以外の 3 択を提示するようにしています。

ユーザーの回答に応じて電話番号を連絡先から選んでもらうか
![連絡先から取得](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/271d2b7b-737c-5319-0944-e208bf4dc25c.jpeg)

直接入力してもらうか
![入力を要求](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/66e852f4-e3bc-7686-8cfc-6b4348b5bcc0.jpeg)

クリップボードから取得するかします。
取得した電話番号を後半に渡します。
![クリップボードから取得](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/76e6daf5-8fe7-1303-5796-fb082583aad3.jpeg)

アップデート確認が選ばれた場合、まず必要な UpdateHub ショートカットをユーザーが持っているか確認しています。持っている場合
![UpdateHub 所持確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/e3830f06-85c3-57e3-0b7c-c3da92063df0.jpeg)

[UpdateHub][link-2] の "Manual Search" 機能を呼び出してアップデート確認を行います。
![UpdateHub 起動](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/60cd00a1-d4b3-857b-39b7-05358270c112.jpeg)

持っていなかった場合、UpdateHub のダウンロードを促します。
![UpdateHub ダウンロード提案](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/26102afb-2c29-7b06-643e-a0376b9671eb.jpeg)

##後半 - 電話をかける

前半から受け渡された電話番号が複数あった場合、どの番号に電話するか尋ねます。
![電話番号が複数の場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/ec833671-14a7-aae5-2329-253b639d6523.jpeg)

1 つの場合はそれをそのまま次に渡します。

電話番号が正しく 1 つだけ選ばれてきた場合には
![正常性確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/1537cf5a-20bd-f4ce-f337-6c8639e31721.jpeg)

プレフィックスと国際電話コードを用意します。
これらはショートカット導入時の質問項目に挙げていて、ユーザーが変更できるようにしています。
![プレフィックスと国際電話コード](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/f858cf3a-d58f-5040-060e-2962b2efd661.jpeg)

選ばれてきた電話番号の先頭が 0（[国内プレフィックス](https://en.wikipedia.org/wiki/Trunk_prefix)）であるならそれを除去します。
（選ばれる電話番号の国内プレフィックスが 0 であると仮定しています。そのためそれ以外の一部の国の電話番号に対してはうまく動作しませんがそこは割り切っています。）
![電話番号先頭の 0 を除去](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/798316ab-8254-4378-2e4e-e5f5a4dafb66.jpeg)

国際電話コードを付与します。
できた電話番号に発信するかユーザーに確認した後
![発信確認](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/9ae6bafb-4b71-5a5d-0ed1-5fc3887d178c.jpeg)

プレフィックスを付与して発信します。
![発信](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321899/cdfa7d75-aada-368a-2343-180c32f9b918.jpeg)

#終わりに

気軽にプログラミングの雰囲気が味わえてショートカット楽しいです。
ただアクションのコピペ機能がないのとアクション群のモジュール化機能がないので、少しでも複雑なことをしようとすると手間取ります。
モジュールを別ショートカットに切り出して呼び出すことはできますが、フォルダ機能もないのでその分ショートカットが増えて見栄えが悪くなりますし…。
この辺改善されるともっと使いやすくなると思うんですが、そこまでするならアプリにしてよってことでしょうか。