Tips&FAQ
本章では、ショートカットAppのレシピを作成するうえで、知っておくと便利な小技と、よくある質問を紹介します。
変数
ブール値型変数を作成したい
ブール値型変数を直接作ることはできませんが、変数の出力値の型変換とアクション「変数を設定」を利用すると作成することができます。
数字型変数に0, 1、もしくはテキスト型変数にTrue, Falseを入れ、値の出力時に「ブール値」に型変換すると、ブール値型のはい・いいえという値を得ることができます。
これをアクション「変数を設定」に入力すると、ブール値型変数になります。
JSON形式を辞書型変数に、辞書型変数をJSON形式に変換する
JSON形式のテキストから辞書型変数を作成するには、アクション「入力から辞書を取得」を使います。
なお辞書型変数を作るまでもない場合は、アクション「辞書の値を取得」を使っても構いません。
逆に辞書型変数からJSON形式のテキストを作成する場合は、アクション「テキスト」に変換したい辞書型変数を入力してください。
〈参考〉
→ 「ショートカット」で「辞書の値を取得」アクションを使用して辞書を処理する - Appleサポート
JSON形式をテキスト形式のplistに、テキスト形式のplistをJSON形式に変換する
JSON形式をテキスト形式のplistに変換するには、アクション「次の種類のファイルを取得」で、JSON形式のテキストが入った変数と、UTIにcom.apple.plistを指定してください。
逆に、テキスト形式のplistをJSON形式に変換するには、「次の種類のファイルを取得」で、plist形式のテキストが入った変数と、UTIにpublic.jsonを指定してください。
2進数・8進数・16進数などを使用したい
数字型変数で使用できるものは、10進数のみです。
2進数・8進数・16進数などを、数字型変数の値として使うことはできません。
テキスト
取得したウェブサイトの文字化けを直したい
アクション「URLの内容を取得」でウェブサイトを取得すると、まれに文字化けしてしまうことがあります。
これはHTML上の文字エンコードの指定と、実際の文字エンコードが異なることが原因です。
なおSafari Appでは、HTML上の文字エンコードの指定は無視され、文字コードを自動判別する仕様になっています。
これを利用して「URLの内容を取得」の代わりに、「Webページの内容を取得」を使用すると、高確率で文字化けを直すことができます。
テキスト型変数の文字コードを変換したい
nkf(Network Kanji Filter)やiconvのようなアクションは存在しません。
なお、ウェブサイトの文字化けについては、前項の方法で解決することができます。
全角・半角文字を変換したい
そのようなアクションは存在しません。
現実的ではありませんが、以下の方法で解決することができます。
正規表現で制御文字を使用する
正規表現では、制御文字を直接記述することができません。
ただし、テキスト型変数を使用することはできます。
そこでアクション「テキスト」に制御文字をコピペで入れたり、「URLエンコード」でテキスト型のマジック変数を作り、それを制御文字の代用にするという方法があります。
重複行を削除する
アクション「辞書の値を設定」を使ったり、JSONファイルを自力で作成し、辞書型変数のキーが重複した場合は値が上書きされる仕組みを利用すると楽です。
ただしファイルサイズが大きいテキストを処理する場合は、メモリ容量の制限でショートカットAppが強制終了してしまうことがあります。
日時
日付型変数を、UNIX時間に変換する
アクション「数字」の、プロパティ「入力」に変換したい日時が入った日付型変数を指定すると、アクションの出力がUNIX時間になります。
なお、秒は小数点以下6桁(マイクロ秒)まで出力されます。
UNIX時間を、日付型変数に変換する
ショートカットAppでは、UNIX時間を直接的に日付型変数の値に変換することはできません。
ただし、UNIX時間は1970年1月1日 0時0分0秒(協定世界時)からの経過秒数なので、この定義を利用することにより、日付型変数に変換することができます。
アクション「日付を調整」で、プロパティ「日付」を1970-01-01T00:00:00Zに、プロパティ「値」を変換したいUNIX Timeを、プロパティ「単位」を秒に、プロパティ「処理」を加算に設定します。
するとアクションの出力が、日時に変換されます。
和暦を出力したい
設定App→一般→言語と地域→暦法 で和暦に設定していない場合は、和暦は出力できません。
またカスタムフォーマットでは、和暦を出力することはできません。
なお上記の設定で和暦に設定すると、デバイスや他のアプリの日付表記が和暦になったり、和暦に対応していないアプリで不具合が生じることがあります。
なぜ通常は、和暦の出力に対応していないのか
iOSでは日付を扱うフレームワークの実装に問題があり、暦法による日付の違いを考慮した設計にはなっていません。
例えば旧暦の明治4年11月21日は、新暦では西暦1872年1月1日なのですが、年の変換しかなされないため1872年11月21日と出力されてしまいます。
iOSが暦の変更を考慮した設計になっていないため、ショートカットAppでは和暦を出力することができないのではないかと思われます。
音声・音楽
読み上げがおかしい
読み上げ機能はiOSの機能なので、iOS側の不具合だと思われます。
なおアクション「テキストを読み上げる」を初めて使うときや、何かの拍子で読み上げの声色がおかしくなることがあります。
まず「テキストを読み上げる」の設定がおかしくなっていないか確認してください。
それでも直らない場合は、設定App→アクセシビリティ→読み上げコンテンツ→声→日本語 で、使用したい声色を選択し直してください。
単語の読み間違いについては、設定App→アクセシビリティ→読み上げコンテンツ→読みかた で、正しい読み方を設定することができます。
iOSには抑揚を設定する方法が存在しないので、抑揚は単語をひらがな化・漢字化したり、句読点・感嘆符・疑問符・空白などを入れて調整してください。
なお抑揚や読み方はAppleサーバで解析しているため、Appleサーバ側のアップデートにより抑揚や読み方が変わってしまうことがあります。
(※iOSのメジャーバージョンアップと同時期に、Appleサーバの大きなアップデートが行われることが多いです。なおAppleサーバの小さなアップデートは、iOSのマイナーバージョンアップ時に行われているようですが、不定期なアップデートもあるようです。)
カスタムURLスキームを使ってミュージックAppで再生したい
通常は、アクション「ミュージックを再生」を使いますが、「URLを開く」でカスタムURLスキームmusic://play/?pid=○○を開く方法もあります。
○○の部分には、Persistent IDを指定してください。
なおショートカットAppでは任意の曲のPersistent IDを取得することはできませんが、「コンテンツグラフを表示」を使うと目視で確認することができます。
コンテンツグラフの、曲名→iTunesメディア→MPMediaItem の末尾に書いてある19桁の数字が、Persistent IDです。
ネットワーク
httpヘッダとレスポンスボディを両方取得したい
httpヘッダとレスポンスボディを、同時に両方取得することはできません。
httpヘッダはアクション「URLのヘッダを取得」で、レスポンスボディは「URLの内容を取得」・「Webページの内容を取得」でそれぞれ取得してください。
ループ
無限ループを作りたい
ショートカットAppでは、無限ループを作ることはできません。
ループ変数の値を書き換える手法も使えません。
無限ループの代替としては、以下の方法があります。
-
アクション「ショートカットを実行」で再帰呼び出しを行い、無限ループにする。
この手法は「ショートカット ユーザガイド」で紹介されている方法です。
ただしSiriに呼びかける方法で実行した場合、デバイスにロックがかかっているときは、ロックを解除するまで「ショートカットを実行」は実行されないため、ループの実行が止まってしまいます。
またレシピの内容によっては、最大実行時間を超えてしまったり、メモリの使用量が膨らんで、ショートカットAppが強制終了してしまうことがあります。
-
繰り返し回数を999回などにして、実質的に無限ループと同じ状態にする。
これが一番無難です。
〈参考〉
→ 「ショートカット」で「繰り返す」アクションを使用する - Appleサポート
ループを途中で離脱したい
Break命令に相当するアクションは存在しません。
またループ変数を書き換えることができないので、その方法でループを強引に離脱することもできません。
ループ中にアクション「if文」を入れて、ループを空回しするなどの方法で対処してください。
アクション「繰り返す」の増分を指定したい
増分は+1で固定されており、任意の値を指定することはできません。
手動変数とアクション「計算」を使って工夫してください。
Siri
レシピの実行中に、「少々お待ちください…」・「えーと」などの返事が返ってくる
何らかの理由でレシピの実行に時間がかかっているとき、「少々お待ちください…」・「しばらくお待ちください…」・「少々お時間をください」などの返事を返します。
さらに時間がかかるときは、追加で「えーっと」という返事を返します。
それでもまだ時間がかかるようであったり、アプリ内部でエラーが発生した場合は、「何か問題が起きたようです。すみませんが、もう一度お願いします。」という返事を返し、レシピの実行をそこで打ち切ります。
通信関連のアクションを実行中に、よく発生するようです。
Siriのバックエンドとして動いているAppleサーバや、通信先の混雑・一時的な不具合が原因だと思われます。
レシピの実行後、「わかりました。」・「完了しました」と言わせない
Siriに呼びかける方法でレシピを実行すると、実行後に「わかりました。」・「完了しました。」という、返事を返すことがあります。
テキストの読み上げや、文字・画像の表示、音声・動画の再生が一切ないアクションを実行した場合に発生するようです。
スペースや改行などの読みが存在しない文字を読み上げさせたり、無音を再生することで、発生しなくなります。
なお、空(Nil)を読み上げさせた場合は、この返事が返ってきます。
標準のSiriコマンドを上書きする
例えばSiriに「Hey Siri、今日の天気は?」と尋ねると、通常はSiriが「天気App」を参照して天気を教えてくれます。
しかしショートカットAppで「今日の天気は?」という名前のレシピを作っておくと、「天気App」ではなく、ショートカットAppの同名のレシピを実行します。
これを利用すると、標準のSiriコマンドをレシピで上書きすることができます。
レシピ作成
レシピの名前を変更すると、「名前を使用できません」というエラーになる
標準のSiriコマンドや他アプリのSiriコマンド・既に存在するレシピと重複してしまった場合に、このエラーが出ます。
「こんにちは!」のように、発声しない記号!などをつければ、別物と判断されるためエラーにはなりません。
ただし前節で説明したように、Siriコマンドは上書きされてしまいます。
レシピに別名・複数の名前をつけたい
バージョン3で、1つのレシピにつけられる名前は1つだけになりました。
同じレシピを複数作って名前を変えるか、アクション「ショートカットを実行」を使い、元のレシピを呼び出す形にして、代用してください。
Siriコマンド「もう一度」・「繰り返す」などを使用しても、レシピを再度実行することができない
ショートカットAppは、そのSiriコマンドには対応していません。
ただし、直近で実行したレシピに読み上げがあれば、それを再度読み上げます。
アクションのプロパティに、特殊変数を指定することができない
プロパティ名をタップしたり、青色の長円形のトークン( )を長押しすると、変数・特殊変数を指定することができます。
それでもダメなときは、一度ショートカットAppを終了させてみてください。
処理速度が遅い・レシピが複雑になりすぎる
アクションエディタ(レシピの編集画面)の中でレシピを実行すると、実行速度が遅くなります。
アクションエディタ以外から実行してください。
かなり高度になりますが、JavaScriptに処理を任せるSafarizeJSと呼ばれる手法もあります。
詳細は次の節を参照してください。
また現実的ではありませんが、「SSH経由でスクリプトを実行」でシェルスクリプトを利用したり、外部に専用のウェブAPIを作りそちらに処理の一部を任せる方法もあります。
処理をJavaScriptに任せたい
SafarizeJSと呼ばれる手法を使うと、処理の一部をJavaScriptに任せることができます。
また<link>タグを利用すると、外部サイトのJavaScriptを取り込むこともできます。
なお「レシピ集」のページで、サンプルレシピ「外観モードを切り替える」を公開しています。
以下は、JavaScriptであいうえおを出力する処理を行うサンプルです。
なお最後の「入力からテキストを取得」は、場合によっては省略可能です。
「リストから選択」で画像を表示したい
アクション「リストから選択」で連絡先型変数を入力すると、氏名の前に顔写真を表示する機能を利用して、任意の画像を表示することができます。
また肩書を表示する機能を流用すると、その項目についての簡単な説明も表示することができます。
具体例は、以下のサンプルを参照してください。
連絡先型変数はvCardで作成し、画像はBase64エンコードで指定します。
なお「レシピ集」のページで、サンプルレシピ「画像つきダイアログ」を公開しています。
デバッグのため、一部のアクションを無効化したい
そのような機能はありません。
またコメントは独立したアクションとして存在しているため、コメントアウトという方法をとることもできません。
あまり現実的ではありませんが、アクション「if文」をかます方法もあります。
レシピをフォルダ分けしたい
ショートカットAppには、そのような機能は存在しません。
他社製ですがLaunch Cutsという、ショートカットApp用のランチャーアプリがあります。
こちらではフォルダ分けをすることができます。
なお次期バージョンでは、フォルダ分けに対応するそうです。
その他
自動操作をしたい
ショートカットAppは、自動操作をするためのアプリではありません。
任意の位置をタップしたり、スワイプするなどの機能はありません。
AppleScript, PowerShellのようなものなので、何ができるかは連携先のアプリの実装次第です。
ゲームを作りたい
ショートカットAppには、ゲームを作れるほどの機能はありません。
ごく単純な数当てゲームのようなものしか作れません。
外部キーボードで任意のレシピを呼び出す
あまり実用的ではありませんが、外部キーボードを接続している場合、iOSのアクセシビリティ機能を使うと任意のキーボードショートカットで任意のレシピを呼び出すことができます。
なお呼び出したレシピを実行するには「実行」ボタンをタップするか、TABキーもしくは矢印キーと、スペースキーを使って「実行」ボタンを押す必要があります。
キーボードショートカットの設定方法は、以下の通りです。
- 設定App→アクセシビリティ→キーボード→フルキーボードアクセス をONにする。
- 「コマンド」をタップする。
- 下のほうにある「SIRIショートカット」の項で、呼び出したいレシピをタップする。
- 外部キーボードで、任意のキーボードショートカット(キーコンビネーション)を入力し、「完了」をタップする。
〈参考〉
→ iPhoneでオンスクリーンキーボードと外部キーボードの設定を調整する - Appleサポート
風向の360°表記を16方位に変換したい
以下のレシピを使うと簡単です。
VPNを切り替えたい
ショートカットAppには、その機能は存在しません。
他社アプリにその機能があれば、そのアプリと連携することで対応できるかもしれません。
なおアクション「Webページを表示」で、URLスキームprefs:root=General&path=VPNを開くと、設定AppのVPNの設定画面を開くことができます。
Wi-Fiを切り替えたい
ショートカットAppには、任意のSSIDのWi-Fiに切り替える機能は存在しません。
ただし、アクション「Wi-Fiを設定」でWi-Fi機能のON, OFFを切り替えたり、「ネットワークの詳細を取得」でSSIDを取得することはできます。
なおアクション「Webページを表示」で、URLスキームprefs:root=WIFIを開くと、設定AppのWi-Fiの設定画面を開くことができます。
レシピの終了後、自動ロックを作動させたい
ショートカットAppには、その機能は存在しません。
またiOSにも、そのような機能は存在しません。
メールボックスをチェックしたい
ショートカットAppには、その機能は存在しません。
次期バージョンでは、オートメーション機能として、特定の送信者からのメールを受信したときに、オートメーションのレシピを作動させることができるそうです。
一定時間経過後に電話を切りたい
電話Appには、そのような機能はありません。
またiOSの仕様で、通話中に何らかの音を鳴らすこともできません。
なおテレホンサービス向けの自動操作機能については、ソフトポーズ・ハードポーズが存在します。
詳細は、アクション「電話番号」の「参考」の節を参照してください。
レシピ実行後にホーム画面に戻りたい
アクション「Appを開く」で、iOSの隠しアプリ SpringBoard (com.apple.springboard)を開くと、ホーム画面に戻ることができます。
ただし通常の方法では、「Appを開く」で隠しアプリを指定することはできません。
レシピをshortcutファイルとして書き出し、パソコン上でSpringBoardを開くように書き換える必要があります。
レシピの書き換え方法は、「共有ショートカット」のページの「shortcutファイルの中身を見る方法」を参照してください。
なお「レシピ集」のページで、サンプルレシピ「ホーム画面に戻る」を公開しています。
※ショートカットAppの仕様変更により、バージョン4(iOS 15)ではSpringBoardなどの隠しアプリが起動できなくなりました。
隠しアプリを起動したい
「レシピ実行後にホーム画面に戻りたい」と同じく、通常の方法では作ることはできません。
ちなみにFTMInternal (com.apple.FTMInternal)を開くと、フィールドテストモードを実行することができます。
なお「レシピ集」のページで、サンプルレシピ「フィールドテストモード」を公開しています。
※ショートカットAppの仕様変更により、バージョン4(iOS 15)では隠しアプリが起動できなくなりました。
コンテンツ・グラフ・エンジンとは何ですか?
簡単にいうと自動型変換(キャスト・動的型付け)機能と、データ・画像などのフォーマット変換機能のことです。
これはiOSのフレームワークと、ショートカットApp独自のContentKitフレームワークによって実現されています。
詳細は、変数のページの解説を参照してください。
ちなみにコンテンツ・グラフは、変数(クラス・構造体)の構造を樹形図で示したものです。
他のアプリとの連携方法がわからない
他アプリと連携する場合、連携先のアプリがAppExtensionのIntents App Extension、もしくはAction Extension(カスタムURLスキーム)に対応している必要があります。
対応していない場合は、連携先のアプリの制作者に対応するようにお願いしてください。
連携先のアプリがIntents App Extensionに対応している場合は、ショートカットAppのそのアプリ固有のアクションが表示されます。
また連携先のアプリでどんなカスタムURLスキームが使えるかは、そのアプリの制作者にお尋ねください。
なぜ、あの機能がないのか
Siriショートカットの機能の補完・ホームオートメーションでは使われない機能については、積極的な実装は行われないようです。
また、セキュリティの脆弱化・プライバシー侵害・迷惑メールの送信などに使われかねない機能については、実装されなかったり、アクションの実行時に手動操作が要求されるなどの制限がかけられています。
このアクションリファレンスに掲載されていないアクションがある
当アクションリファレンスでは、バージョン3.2(iOS 13)の時点での標準のアクションとAppleの無料アプリのアクションのみを紹介しています。
すでに廃止されており新規作成ができないアクションや、他社Appのアクションは、紹介していません。
ショートカットAppの挙動がおかしい
明らかにショートカットAppがおかしい場合は、ショートカットAppを一度完全に終了させてください。
たいていは、これで直ります。
それでも駄目であれば、iOSが一時的な不具合を起こしている可能性があります。
デバイスを再起動してください。
iOSのバージョンアップ後におかしくなった場合は、iOSの仕様変更によって生じた不具合だと思われます。
ショートカットAppは意外と不具合が多いアプリで、過去の例でもiOSのメジャーバージョンアップの後で大きな不具合がいくつも見つかっています。
iOSのマイナーアップデートと同時にショートカットAppのバージョンアップが行われるので、それまで我慢してください。
なおiOSのメジャーアップデートの際に、レシピが壊れることがあるようです。
こまめにレシピのバックアップをとるようにしましょう。
〈参考〉
→ iPhone、iPad、iPod touch でAppを強制終了する方法 - Appleサポート
→ iPhoneを再起動する - Appleサポート