2019年11月8日 | ブログ記事

iOSショートカットで遊ぶ [アドベントカレンダー2019 9日目]

toki

この記事はアドベントカレンダー2019の9日目の記事です。


みなさんこんにちは!19Bのtokiです。

iOSユーザーのみなさんは、ショートカットというアプリをご存知でしょうか?自分は最近その存在を知り、使い方を模索中です。この記事ではショートカットの使い方、自分がどう使っているかについて触れていきます。

ショートカットって?

ショートカットとは、Appleが提供するアプリの一つ。2019年9月にリリースされたiOS 13からはデフォルトでインストールされているようです。他のアプリやiOS自体の機能と連携を取り、「いくつかの事をまとめてショートカットとして実行」することができます。

使ってみる

個人の使用例です。

自分は毎日夜寝る前に6:00, 6:15, 6:30, ...といくつかアラームをオンにし、朝起きたらそれらを全てオフにしています。慣れてしまえば十数秒かかるだけの作業なのでいいのですが、たまに消し忘れがあり、それが朝の支度をしている時に鳴って... やっぱり手でやるのは嫌ですね。よくする機械的な動作なので、ショートカットにしてしまいましょう。

「ショートカットを作成」を押し、そこに実行する項目を追加していきます。下のバーより「App」を選択>「時計」>「アラームを切り替える」とあるので追加、オンまたはオフにしたいアラームを選択します。

完成したら、ショートカットアプリのホーム画面から、またはウィジェットからタップすると実行できます。これで一気にアラームをオン/オフすることができます!

ショートカット作成時にいくつか手動でオン/オフにするアラームを選んでも良いのですが、せっかくなら「全て」オフにしたいですね。「~の各項目を繰り返す」「この場合に~をする, そうでない場合に~をする」という処理があります。for文とif文です。これを使うと、アラームを全てオン/オフするショートカットが作れます。

このショートカットをダウンロード

ブロックプログラミングみたいですね。

他人の作ったショートカットを使おう

上にこのショートカットをダウンロードとしてリンクを貼りましたが、他人の作成したショートカットをURL(www.icloud.com/shortcuts/...)経由で取得、自分の端末に入れることが出来ます。公式のギャラリーはもちろん、ググると有志のショートカット共有サイトが出てくるので見ると面白いかも...?

他にも例えば、

といったようなことが出来ます、なんだかすごそうですね。ちなみにこれらはショートカットアプリ内の「ギャラリー」に載っていた例です。

後述しますが、ショートカットは割となんでも出来てしまうので、有志作成のショートカットを入れるときは内容をしっかり確認し、自己責任でお願いします(それこそ簡単に位置情報や連絡先を盗んだりできます)。

もっと見てみる

本題です。前置きが長い
ショートカットができるアクションはたくさんあるので、そのうちのいくつかを紹介します[1]

ショートカットを実行

ショートカット内から、別のショートカットを呼び出すことができます。アクションの説明に「入力」「出力」とありますね。
ショートカットの各アクションには入力と出力があり、関数のようなものだと考えることができます。ショートカット自体も同じく、入力と出力を持ちます。ショートカットの入力はそのショートカット内で「ショートカットの入力」という変数として利用できます。出力は最後のアクションの出力です。
またこの時、オプションから「実行中に表示」をオフにしておかないと、実行時に呼び出し先のショートカットでどこを処理しているかがいちいち見えてしまうので鬱陶しいです。デバッグ時や見た目を楽しむ時以外はオフにしておいた方が良いです。

ショートカット内から、そのショートカット自身を再帰呼び出しすることもできます。
簡単な再帰呼び出しとして、階乗の計算やフィボナッチ数の計算ができます。(上手い例が思いつかない...)
Factorial(fn)
呼び出し側

変数を設定/取得

ショートカットでは、そのショートカット内で、あるアクションの出力を「マジック変数」として選択し他のアクションの入力に使うことができます。
それとは別に、このアクションでは、そのショートカット内で使える変数を設定、または取得ができます。一般的なプログラムの変数代入/取得と似た感じです。プログラミングっぽいことをするならこっちを使うことになるかも。

入力から辞書を取得/辞書の値を取得/辞書の値を設定

辞書型、または連想配列と呼ばれる型の変数です。keyとそれに対応したvalueを設定、取得することができます。
「入力から辞書を取得」では、JSONなどのkey-value形式のテキストから、ショートカット内で使える辞書型変数に変換します。

URLの内容を取得

HTTPリクエストです。URLと、メソッド・Header・Body等を指定して内容をフェッチします。

Webページの内容を取得

指定されたURLのWebページをSafariで(裏で)開き、その内容を出力として返します。これでWebスクレイピングでもしろということなのでしょうか。
この時、そのページに埋め込まれているJavaScriptも実行されます。この性質を使い、以下のだいぶ怪しい方法で任意のJavaScriptが実行できる・・・?多分できますが、非同期な処理は怪しいです。

実行したいJavaScriptをまずHTMLにscriptとして埋め込み、その実行結果をHTMLのbody.innerTextに配置するようにします。テキスト中にショートカット内の変数をテキストとして埋め込めるので、JavaScriptへの変数はこれで渡します。
次にこのHTMLをデータURL形式(data:text/html,<html>...)でURLとして渡し、このアクションを実行します。するとHTMLのbodyにJavaScriptからの実行結果が配置されるので、これが取得されます。

次の例では、JSON形式のテキストで入力(keyとdata)を受け取り、HMAC-SHA1をHTMLに埋め込んだJavaScriptで計算します[2]
例: HMAC-SHA1を計算

作るぞ作るぞ

これらを使い、何かを作ります。
HTTPリクエストができるということで、Webhookが飛ばせますね。
ここでは、traPの部内チャットサービスであるtraQへWebhookでの投稿を実現してみようと思います。ちなみに似た感じでDiscordのWebhookSlackのWebhookもできそうです。

作る

作るとは言っても、WebhookのURL[3]を取得&そこへ指定された形式でHTTP POSTリクエストを飛ばすショートカットを作るだけですね。

今回作ったものの大まかな流れは以下の通りです。

投稿したいメッセージを、ショートカット実行時に尋ねて取得

改行(\n)を置換する(\\n)[4]

メッセージとWebhook secretの値から、HMAC-SHA1によりsignatureを計算

指定された形式に整え、WebhookのURLへ飛ばす

以下に実際のショートカットを置いておきます。実行するには、Webhook IDやWebhook secretを自分のものへと置換する必要があります。
traQへ投稿 メインの関数(実際に投稿するときはここを実行)。
Replace Newline \n\\nに置換する関数。
HMAC-SHA1 signatureを生成するための関数、前述したものです。

これらを組み合わせれば、あなたもショートカットからWebhookへの投稿ができるはず...!

実行

ショートカットアプリ自体から、もしくはウィジェットから実行することができますが、「ホーム画面に追加」をするとホーム画面からも実行ができるようになります。

こんな風にメッセージを入力して...

投稿されました🎉
これであなたもショートカットマスター


おわりに

今回の例ではアラームを付けたり消したり、HTTPリクエストを飛ばすだけでしたが、ショートカットはめちゃめちゃ奥が深いです。今回は触れなかった「オートメーション」も組み合わせると、もっと便利なことが出来たりします。
ギャラリーや有志の作成したものを見て、ああこういう使い方があったんだな、と自分もこの記事を書きながら勉強していました。みなさんも自分に合ったショートカットを見つけて、良いショートカットライフを!

明日は神絵師鴨絵師として有名なsummon_salmonさんの記事です。楽しみ〜


  1. 長々と書きましたが、機能の解説についてはこの記事が素晴らしいので置いておきます。 ↩︎

  2. About HMAC-SHA1! - shortcuts の回答にあったものを少し変えたものです。 ↩︎

  3. 関係無いですが最近知ったこととして、WebhookのエンドポイントURLは基本シークレットにしなきゃいけないみたいです。なぜなら公開したら、認証システムが無かった場合、誰でもそのWebhook経由で投稿ができてしまいます。 ↩︎

  4. 改行の置換については、これをするとなぜかHMAC-SHA1の計算が上手くいったので、厳密な理由は理解していないです。 ↩︎

この記事を書いた人
toki

Java, Go, JS/TSらへんをいじったりしています

この記事をシェア

このエントリーをはてなブックマークに追加

関連する記事

2019年11月21日
DEATH STRANDING【AdC2019 22日目】
Amanogawa
2019年11月20日
AAっぽい動画を作る【Advent Calendar 2019 21日目】
hosshii
2019年11月20日
キラッとプリ☆チャンつくってみた!
d_etteiu8383
2019年11月19日
Advent Calendar 2019 20日目
Adwaver_4157
2019年11月18日
C++スタイルのキャスト演算子を使おう!【アドベントカレンダー2019 19日目】
kegra
2019年11月17日
据え置きの音をお外に持ち出そう
liquid1224

活動の紹介

カテゴリ

タグ