地味に反響の大きな AlarmKit について。筆者は10年以上前にポモドーロタイマーアプリをリリースしたことがあったが、ローカル通知頼りにならざるを得ず、体験的にイマイチだったし、通知が溜まりまくってカオスになってしまっていた。AlarmKit があれば、ポモドーロ以外にも細かなシーンを補えるので嬉しそう。(例えば筋トレアプリだとインターバルの残り時間とか)
0:00 – ようこそ
- AlarmKit はアプリでアラームを作成できるフレームワーク
- スケジュール型とカウントダウン型の2方式目立つアラートを提供
- サイレントモードやフォーカスを突破してアラートを表示
- カスタムアラームタイトルとアプリ名を表示し、停止やスヌーズ機能を提供
- StandBy や Apple Watch でもサポート
- Live Activities を使ったカスタムカウントダウンインターフェースも可能
0:32 – 概要
- アラーム機能はユーザーが各アプリごとにオプトインで有効化
- 許可は手動で要求するか、最初のアラーム作成時に自動要求
- 設定アプリでいつでも許可状態を変更可能
NSAlarmKitUsageDescriptionをinfo.plistに追加して使用目的を説明AlarmManager.requestAuthorization()で手動許可要求
authorizationStateで許可状態を確認してからアラームをスケジュール- 拒否時の制限明示も重要
1:39 – 作成
- アラーム作成に必要な要素:
- カウントダウン時間(pre-alert/post-alert duration)
- スケジュール(固定日時または相対パターン)
- 外観設定
- カスタムアクション処理
- 関連サウンド
- スケジュールの指定:
- 固定スケジュール:特定の未来日時を指定(タイムゾーン変更に影響されない)
- 相対スケジュール:時刻と週次繰り返しパターンを指定(タイムゾーン変更に対応)
- アラーム外観のカスタマイズ:
AlarmButtonでボタンのテキスト、色、アイコンを設定- アイコン(SF Symbols)は Dynamic Island 表示に使用
AlarmPresentationでアラートタイトルを設定AlarmAttributesでアラーム属性を設定- 表示のレンダリングに必要な情報
tintColorの設定:アラームとアプリの関連性を伝えるのに役立つ
AlarmConfigurationに、duration と attributes を含める
- カウントダウン表示の設定:
- 繰り返しボタンを
AlarmPresentationのsecondaryButton/scondaryButtonBehaviorに指定 (.countdown) - Live Activities を使ったカウントダウン UI
- Live Activity を Widget Extension に追加
- 追加情報の表示設定:
AlarmMetadataをAlarmAttributesのmetadataに指定- Live Activity 側で
context.attributes.metadataを抽出して表示に活用
- カウントダウンインターフェイスの表示はシステムが保証:システム表示のカスタマイズ(一時停止/再開ボタン等)
- 繰り返しボタンを
- カスタムアクション:
- App Intent を使ったカスタムボタンアクション
- アプリを開く、詳細表示等の処理
- アラームに一意の識別子を定義して追跡できるようにする
- サウンド設定:
- デフォルトシステムサウンドまたはカスタムサウンド
- ActivityKit の AlertSound 構造体を使用
- サウンドファイルはメインバンドルか、Library/Sounds に格納
16:32 – ライフサイクル
- AlarmManager クラスでアラームのライフサイクルを管理
- 一意の識別子を使ってアラームを追跡
- カウントダウン状態への移行、キャンセル、停止、一時停止、再開が可能
- ベストプラクティス:
- 特定間隔のカウントダウン(料理タイマー)や繰り返しアラート(目覚まし)に適している
- 重要な通知や時間敏感な通知の代替ではない
- アラート表示は明確で理解しやすく(何のアラームか、どのようなアクションが可能か)
- Live Activities には残り時間、停止ボタン、一時停止/再開ボタンを含める