AlarmKitのはまりどころ
AlarmKitはiOSでアラームを実行するためのAPIです。iOS 26以降で利用でき、これまでは制限されていたライブアクティビティでのカウントダウン表示に対応しています。
先日、AlarmKitを使ったタイマーアプリをリリースしました。本記事では、このアプリの開発で困った点を中心にTipsをまとめました。
AlarmKitで実装した「手巻きタイマー」アプリ
指をくるくる回して時間をセットするアナログ風タイマーです。誰でも直感的に操作できて楽しいのでぜひ使ってみてください。150円です。
制限
組み込み時計アプリのタイマー機能以上のものは作れない?
AlarmKitによって、組み込みの時計アプリと同じようにライブアクティビティでカウントダウンを表示できるようになりました。カウントダウンの一時停止・キャンセルボタンも用意されており、アラームの実装の負担が減りました。
ですが、体感では最低限の機能をやっと解放したという感じで、完全に自由とは言いがたい印象です。組み込み時計アプリのタイマー機能以上のものは作れないと考えるのが無難でしょう。バッテリー消費などの理由で、ライブアクティビティで好き勝手やって欲しくないからかと思います。
iOS 26以前の環境では使えない
AlarmKitはiOS 26から導入されたので、当然ながらiOS 26以前の環境では使えません。iOS 26以前の環境もサポートするのであれば、AlarmKitを使わない実装も用意する必要があります。また、ライブアクティビティの内容も変更する必要があります。iOS 26以前のライブアクティビティはリアルタイムのカウントダウンができません。(そのため前記の私のタイマーアプリでは、iOS 26以前のライブアクティビティでは終了時刻を表示するように変更しています)
ドキュメント
AIからの利用
AlarmKitはiOS 26から導入されて間もない新しいライブラリなので、いまのところAIは必要な情報を持っていません。AlarmKitを使うように指示を出してもうまくいかないはずです。公式ドキュメントを読むように指示してもいまいちです。そこで、以下の情報源を追加し、まともなコードを生成するためのヒントを与えます。
Apple Doc MCP
なぜ私がApple Docs MCPを作ったのか - AlarmKit開発で見えたAIの限界
Apple Doc MCPは、アップルのドキュメントをMCPで検索可能にするツールです。AIがAlarmKitのドキュメントを参照できるようになります。(奇遇にも、この方もAlarmKitの情報不足がきっかけだったようです)
私は現在Gemini CLIを使っていますが、Geminiは検索の仕方が悪くて勝手に諦めてしまうことがそこそこありました。そこで以下で触れるサンプルコードを追加したところ、検索の精度が上がりました。
サンプルコード
Scheduling an alarm with AlarmKit
もう一つの情報源は公式のサンプルコードです。AlarmKitの使い方はさほど複雑ではないので、ドキュメントのサンプルコードがあれば十分な質のコードを生成できる可能性が上がります。事前に前記のApple Doc MCPと併用してサンプルコードを分析させておくといいと思います。プロジェクトと同じディレクトリやAIがアクセスしやすいディレクトリに置いて参照させるのもいいと思います。
動作確認
必ず実機で確認する
AlarmKitで実装した機能は、必ず実機で確認しましょう。シミュレーターはAlarmKit対応が不十分で、実機と挙動が異なる場合があります。
遭遇した範囲では、 Text.init(timerInterval:pauseTime:countsDown:showsHours:) によるカウントダウン表示の違いがあります。このビューは残り時間を自動的に計算してテキストを表示するのですが、シミュレーターでは秒数表記が "--" になって表示されないことがあります。このイニシャライザ自体に問題があるのかと考えてさんざん試しましたが、どうもシミュレーターでのみ再現するようです。
ライブアクティビティ
Text.init(timerInterval:pauseTime:countsDown:showsHours:) のロック画面の問題
このイニシャライザはシミュレーター以外にも、ライブアクティビティのロック画面でのレイアウトに問題があるようです。表示されるテキストは左寄せにしかできないようで、 Text のいずれの右寄せ方法でも右寄せになりません。右寄せにしたいなら、テキストビューの位置と幅を調整して「右寄せに見せかける」必要があります。
ちなみにアップルのサンプルアプリは、組み込みの時計アプリと異なり、ライブアクティビティで残り時間が左端に配置されています。右寄せが難しいのがわかっててわざと左に配置したのではないかと邪推したくなります。
ライフアクティビティを手動で終了させない
タイマー完了時、アクティブなライフアクティビティを Activity.end(_:dismissalPolicy:) で終了させる必要はありません。ライフアクティビティは自動的に終了し、通知画面に遷移します。
おまけ: サンプルアプリの分析例
アップルのサンプルアプリを分析させた例を以下に示します。Apple Doc MCPを併用しました。
