ショートカットアプリには「待機」アクションがあります.
処理を待たせることはもちろん、タイマーとして使う人も少なくありません.
しかしこのアクションは以前より改善されたもののタイムアウトや意図せず起こったメモリ解放に巻き込まれていつの間にか止まっていた…なんてデメリットがあります.
何よりショートカットの性質により、そのレシピやオートメーションは待機が終わるまで何もできません.
そのため長時間待たせるのは「待機」アクションでは不安が残ります.
これらのデメリットを解決する手段として、集中モードを使ってみます.
(タイマーと銘打っていますが実際には他のことも自由にできます)
※価格は記事執筆時のものです. 現在の価格はApp Storeから確認ください.
スポンサーリンク
0:準備
まず専用の集中モードを作っておきます.
設定アプリから「集中モード」を選び、画面右上の+アイコンをタップします.
「カスタム」を選び、名前と色、グリフを選んで次へ進み、作成します.
こうして用意した集中モードは、オートメーショントリガとしてしか使わないため、通知などの設定は特に弄りません.
1:基礎編
まずはシンプルな構造から考えます(とはいってもショートカットレシピとオートメーションを組み合わせるのでそこそこの難易度です).
1-1:レシピ
まずレシピの方から組みます.
「入力を要求」で秒数を入力させます、そのためオプションの「小数点以下の数字を許可」「負の数字を許可」は両方ともオフにしておきます.
集中モードはオンオフ時に通知が出てきます、そのためすぐに通知を出すと被ってしまうため、やり過ごす分だけ「待機」する必要があります.
そのため入力した秒数から12秒引いて、それを現在の時刻から加算し、先程作った集中モードをその時間までオンにします.
(機種やiOSの具合によっては、引く秒数は前後すると思います)
レシピではこうしてトリガとなる集中モードのスケジュールだけ立てて完了します.
このレシピによって、専用の集中モードがタイマー代わりになるわけですね、オフになったときがおおよそ指定時間ということです.
また集中モードの仕様で、設定時刻は現在時刻の2秒以上先でないとエラーになるようです.
今回の場合12秒引いているので、「入力を要求」では13以上の数でないといけないことになります.
1-2:オートメーション
ショートカットアプリの「オートメーション」から先程作った集中モードを選択します.
先程のレシピでは「オフになったとき」がタイマーとしての時間なので「オフになったとき」にのみチェックを入れ、「すぐに実行」にチェック、次へ進んで「新規の空のオートメーション」をタップして編集画面に移動します.
集中モードがオフになってからタイマーとして例えば通知を表示するなら、少しだけ「待機」で待ってから表示します.
この待機の秒数もまた機種次第です.
実行
実際に実行すると集中モードが立ち上がり、オフになって数秒後に通知が表示されます.
基本的にはこれで問題ないです.
しかし集中モードを使用する以上避けられないのは他の集中モードが既にオンの場合です.
2:応用編
応用では、基礎に加えて
- 他の集中モードへの対策
→実行時に他の集中モードがオンだった場合、タイマー終了後に戻したい - タイマーの中断
、この2つを取り入れます.
2-0:準備
応用編ではData Jarというアプリを使います.
「ファイル」アプリでもいいんですがデータの管理・読み書きで非常に便利です.
日本語に対応してない程度しかデメリットがありません.
2-0a:前回の集中モードをチェックする
後で前回の集中モードに戻すために、何の集中モードだったかを把握しておく必要があります.
その集中モードの名前を入れておくデータをData Jarで作っておきます.
「現在の集中モード」はアクションがありますが「前回の集中モード」はないため、他のレシピなどでも使えるよう、下記のように単独で作っておくと良いです.
インストールしたData Jarを開き、画面下の"Add Value"または画像右上の+アイコンをタップします.
今回は「前回の集中モードの名前」が欲しいので種類はデフォルトの"Text"のまま、Keyは今回はPreviousDNDと名付けておきます(DND=Do Not Disturb).
次にショートカットアプリでオートメーションを作成します.
今回のタイマーによりオフになったのをオンにしたい集中モードを選び、「オフになったとき」にのみチェックを入れ、編集画面では画像右のように組みます.
「テキスト」アクションにトリガの集中モードの名前を一字一句間違えず、余計な文字を入れずに書き、これをData Jarの"Set Value"アクションで先程作ったキーの値として上書きします.
このようなオートメーションを、タイマー実行後に復帰させたいすべての集中モードに対して作っておきます.
これでData Jarの(今回作った)PreviousDNDというキーに、常に前回の集中モードが記録されます.
本当はこういうの一括でやりたいんですけど、今のところ集中モードは予めひとつ選ぶ仕様なので各々で作る必要があるんですね.
2-0b:各種フラグを管理するデータ
レシピとオートメーションは基本的には繋がっていないため、なにかデータを受け渡しするにはメモやファイル、今回使っているData Jarなどを介する必要があります.
また上で前回の集中モードをチェックしていますが、毎回戻すわけではありません.
中断するかどうかも判断しなければいけません.
というわけで先程のデータ以外にも情報やフラグの受け渡しが必要です.
再びData Jarを開いて新しいデータを作るのですが、今回は管理しやすいよう"Dictionary"を選びます.
"Key"は今回は"DNDtimer"とでも名付けます.
追加したデータ"DNDtimer"をタップするとそこからデータを追加できるようになっているので、"Add Value"をタップして次の3つのKeyでデータを追加します(いずれも種類は"Number"、デフォルトは0).
- time
タイマーの秒数です、後で表示したりできるので折角なので追加 - flag
今回のタイマーそのもののフラグです、実行したら立たせます - previousDND
実行時に他の集中モードがオンだったかどうかのフラグです
2-1:レシピ
まずはレシピからです.
全体に言える話ですが、Data Jarの"Set Value"は入れずれも上書きが前提です.
まずData Jarの"Get Value"でDNDtimerのflagキーの値を取り出します.
0の場合は通常の処理です.
今回の場合DNDtimer.flagという風にドットで繋げればOKです(他も同様).
フラグが立っていない場合はタイマーの秒数を「入力を要求」で入力させ、またこのタイミングで現在時刻を拾い、タイマーの秒数をData Jarの"DNDtimer.time"に代入しておきます.
フラグDNDtimer.flagが立ってない場合で続けて、現在の集中モードを取得します.
これが任意の場合、つまり何らかの集中モードがオンである場合は、その集中モードをオフにし、フラグDNDtimer.previousDNDを1に上書きして立てます.
(別方で作ったData JarのPreviousDNDには既にその集中モードの名前が書かれています)
このif文から抜けて、先程入力したタイマーの秒数を10引き、現在時刻からその秒数を加算した時刻で今回作った集中モードをオンにします.
(この10という数字も各々で調整してください)
その後Data Jarのキー"DNDtimer.flag"を立てます(1を代入).
7秒待機した後に通知を表示していますが、これは必須ではありません.
次は最初のif文のその他の場合、つまりDNDtimer.flagが0でない、中断のフラグが立った場合です.
「アラート」アクションで以降の処理をするか判断させます(キャンセルすればそのまま続行).
まずは今回のタイマーで用意した集中モードをオフにします.
次にData Jarの"Get Value"で"DNDtimer.previousDND"の値を取り出します.
このフラグが立っている場合は「実行時に他の集中モードがオンだった」ということなので、条件に合う場合はData Jarの"Get Value"で"PreviousDND"の値、つまり前回の集中モードの名前を取り出し、その集中モードをオンにします.
DNDtimer.previousDNDが立っていない場合は何もしません.
最後にDNDtimer.flagとDNDtimer.previousDNDのフラグを降ろして(0で上書き)完了です.
DNDtimer.timeはわざわざクリアしなくとも良いので放置します.
2-2:オートメーション
ここからはオートメーションです.
トリガーはタイマー専用の集中モード、「オフになったとき」だけ実行します.
オートメーションの中身を組みます.
DNDtimer.flagが立っている場合だけ、メイン処理を行わせます.
.
DNDtimer.previousDNDが立っているなら、前回の集中モード(PreviousDND)を取得してオンにします.
if文から抜けて、6秒待機した後DNDtimer.time経ったことを通知させます.
赤く囲った場所に、タイマーの時間が来た際の処理を行わせるわけですね.
すべてのif文から抜けた後、最後にDNDtimer.flagとDNDtimer.previousDNDのフラグを降ろして完了です.
実行
実行時に他の集中モードがオンでなかった場合は、基礎編と同じような見た目で振る舞います.
実行時に他の集中モードがオンだった場合は、その集中モードがオフになってから専用の集中モードがオンになり、レシピ側で追加した通知が表示されます.
タイマーの時間から数秒前に専用の集中モードがオフになり、前回の集中モードがオンになってから、オートメーションで追加した通知が表示されます.
専用のオートメーションがオンの状態でレシピを実行すると、アラートが表示されます.
OKをタップすれば専用のオートメーションがオフになり、タイマーは停止します.
〆
集中モードを意図的に止めるかレシピで停止しない限り、ショートカットを終了しても端末を再起動してもおよその時間になったら通知してくれます.
ショートカットなのでアラームとしての通知でなく他の処理もすきなだけ可能です.
通知の代わりに「ホーム画面へ移動」+「画面をロック」を入れれば指定時間後のアプリロックにも使えますね.
集中モードを配慮すると見ての通りレシピが面倒になるのと、ショートカットのバグが怖いのがデメリットですね.