なめこを栽培する技術
平成から令和に変わって早6年、2024年のこの現代に「なめこ栽培キット」でなめこを栽培しています。
この記事ではなめこ栽培キットをiPhoneで攻略する特殊技術を紹介します。
なお、この記事で紹介するテクニックを実現するには、アプリ開発の技術があるか、900円の有料アプリに課金する必要があります。
もしアプリ開発ができず、なめこの栽培が課金するほど重要なものでない場合、この記事は一種の読み物として読んでいただけると幸いです。
なめこ栽培とは
なめこフードを与えて、定期的になめこを収穫するゲームです。
与えるなめこフードには15分、30分、1時間、4時間、12時間の持続時間があります。
持続時間が短い方がレアななめこが発生しやすいのですが、なめこフードが切れると せっかく生えたなめこが少しずつ枯れていきます。
なめこの栽培は大変
きっかけとかは全く覚えてないのですが、いつの間にか仲の良い友達数人で図鑑100%を巡って競争することになりました。
しかし、正直このゲームは自分に向いてませんでした。
レアなめこを集めるなら15分のなめこフード一択なのですが、基本的に忘れっぽい性格をしている自分にとって、15分後に再度アプリを開くことはかなり難しく、気がつけば数時間(もしくは十数時間)経っていてなめこが全て枯れることも多々ありました。
そんなこんなしているうちに図鑑を100%完成した友達が現れ始め「これはいかん」ということでテクノロジーの力を頼ることにしました。(なおチートではありません)
解決策
基本方針
達成したいゴールはシンプルです。
「なめこフードを補充してから15分後に知らせ、スムーズになめこを収穫できる」
なめこフードを補充するたびにiPhoneの時計アプリを開いてタイマーを設定するのでもいいのですが、正直だるいです。
しかも、ただなめこフードを補充するためにタイマーで知らせるのも過剰です。
そこで良いものがあります。ショートカットアプリです。
iPhoneユーザーの方であれば、見たことがあるかと思いますが、多くの人はこのアプリをよくわからない使えないものと思い、ホーム画面から消しているのではないでしょうか?実はこのアプリかなり便利なのです。
ショートカットを実行するタイミング
ショートカットアプリには「オートメーション」という機能があります。
これは特定のタイミングでiPhoneに色々なことをさせることができるのです。
例えば、毎日夜の23時に朝の7時のアラームを毎日自動で設定させたり、帰宅途中家に近づいたら自動で部屋の電気をつける、などです。
さて、今回のなめこのケースで考えます。
「なめこフードを補充したタイミング」は難しいのですが、「なめこアプリを閉じたタイミング」に何かさせることはできます。
なので、アプリを閉じる時になめこフードを補充する癖をつけとけば、なめこフードを補充したタイミングとアプリを閉じるタイミングはほぼ同じになり、事実上なめこフードを補充したタイミングに何かすることができるようになります。
そのタイミングで「今から15分後に通知する」動作をショートカットアプリにさせると良さそうです。
15分後の通知
さて、ここから具体的な動作を作っていきます。
まずはなめこのアプリを閉じてから15分後の時刻を取得します。
「アクションを検索」から「日付」を追加すると「現在の日付」というアクションが追加されます。
ここから15分を足したいので、次は「日付を調整」というアクションを追加し「日付に15分を追加」になるようにします。
さて、次はこの時間に通知する設定を追加していきます。
ここで残念なお知らせです。
標準のショートカットアプリには「今すぐ通知する」アクションはあれど、「指定した時間に通知する」というアクションは存在しません。
つまり、なめこを閉じた瞬間にしか通知を出せないのです。
これでは意味がありません。15分後に知らせて欲しいのです。
これを解決する方法の一つとして「ショートカットのアクションを提供するアプリを自作する」です。
自分はiOSのアプリ開発が少しできるので、この方法を選びました。
ちなみにアプリ開発の技術がなくても、Toolbox Pro というアプリで同様のことが実現できそうです。
こちらはショートカットアプリにはないアクションの詰め合わせで非常に便利そうなのですが、通知の機能を使うには追加で900円の課金が必要です。
ここから先はアプリ開発の話になります。アプリ開発ができない人は、「なめこフードを補充し忘れないために技術の無駄遣いをしているなぁ」と冷ややかな目で読んでいただければ幸いです。
ショートカットキット
さて、今回作成するアプリは「ショートカットキット」と名付けました
このアプリは指定した時間に通知するアクションを提供します。
少し過剰ですが、以下のようなパラメーターを持つアクションを定義しました。
通知する時間
通知のタイトル
通知のサブタイトル
通知の本文
通知をタップした時に開くURLスキーム
通知の識別子
通知に添付するファイル
即時通知かどうか
さて、ショートカットのアクションはAppIntentsフレームワークのAppIntnetプロトコルに準拠することで実現できます。
上の定義をAppIntentで実装すると次のようになります。
AppIntentの定義はできました。
次はこのAppIntentをperform関数を実装し、ショートカットが実行された時の動作を実装します。
といっても難しいことは何もありません。
定義に従ってUNNotificationRequestを用意するだけです。
さてさて、これで完成です。
実際には他にも、通知がタップされた時に、通知のuserInfoに入っているurlを開くなどの処理も他に書く必要がありますが、今回は省略します。
さて、作成したアクションを先ほど作りかけたショートカットに追加します。
通知する時間は「調整済みの日付」にします。これで15分後に通知が設定されます。
通知のタイトルや本文はなんでも構いません。
識別子がポイントです。設定する値はなんでも構いませんが、適当な文字列を指定することを忘れないでください。
識別子を設定することで、アプリを閉じて15分経つ前にアプリを再度開いて閉じた時に重複して通知が設定されることを防いでいます。
即時通知にするかどうかは好みで良いと思います。即時通知にすることで集中モードを設定していても通知を受け取れます。また、通知をタップするまで最大1時間ロック画面に常駐します。
さて、ここまで設定すると、なめこを閉じてから15分後に通知が送られるようになります。
なめこアプリを開く
今は通知を飛ばしているだけであり、この通知をタップしてもなめこアプリは開かれません。通知を受けることができても、スムーズになめこを開けないようでしたら、なめこアプリを開くのサボってしまい、たちまちなめこは枯れてしまいます。
しかし、残念ながらどれだけプログラミングの技術を駆使しようと、iOSアプリから別のiOSアプリを開くことは、開きたいアプリがURLスキームを公開していない限り実現不可能です。なめこアプリはURLスキームを公開していないので、自作のアプリから直接なめこアプリを開くことはできません。
ところが、ショートカットアプリなら、「アプリを開く」というアクションを利用することで任意のアプリを開くことができるのです。
ということは、事前になめこアプリを開くだけのショートカットを作成しておき、それを自作アプリから呼び出すことで、間接的になめこアプリが開けそうです。
ショートカットアプリはURLスキームを公開しており、そのURLスキームを開くことで任意のショートカットを実行することが可能です。
shortcuts://run-shortcut?name={ショートカットの名前}
では、これを実現していきます。
まずは、なめこアプリを開くだけのショートカットを作成します。
ショートカットの名前は OpenNamekoにしています。多分日本語でも問題ないと思いますが、URLスキームに入れるので英語の方が都合がいいです。
さて、先ほど登録した、「15分後になめこの通知」ショートカットのURLスキームを「OpenNameko」ショートカットを開くURLスキームにします。
shortcuts://run-shortcut?name=OpenNameko
ここで設定したURLスキームは通知をタップした時に呼び出されるので、
通知をタップ
→ショートカットキットアプリが開く
→OpenNamekoのURLスキームが呼ばれてショートカットアプリが開く
→OpenNamekoが実行される
→なめこアプリが開かれる
という挙動を実現できます。
最終成果物
実現できた挙動がこちら。
なめこアプリを閉じてから15分経つと自動で通知がきて、その通知をタップするとなめこアプリが開かれます。
知見
意外なことに、他のアプリを閉じた/開いたといったイベントの取得や、他のアプリを開くなど、アプリ開発者がSwiftコードでは実現できないような挙動もショートカットアプリでは利用可能になっています。
一方、Swiftでコードを書いた方が通知などの細かい挙動をコントロールできます。
このように、ショートカットアプリとSwiftコードにはそれぞれの得意/不得意があり、それぞれの得意な領域でお互いをカバーすることで、日常生活をより便利にすることができます。
まとめ
ということで、無事に図鑑100%を達成できました。
余談
この技術について目を輝かせながらエンジニアの友達に話をしたところ「マジックマッシュルーム中毒」とあだ名をつけられました。
この記事が気に入ったらサポートをしてみませんか?