見出し画像

iOSの「マナーモードでも鳴る通知」を実装した話

背景

個人開発しているiOSアプリで、「通知が来ても気づかれない」という課題にずっと向き合ってきた。

サイレントスイッチがONになっていたり、集中モード(おやすみモード等)が有効だったりすると、通常の通知は音もバイブも鳴らない。これはiOSの仕様であり、アプリ側からはどうにもできない領域だ。

Android版では、ロック画面から自動的にアプリを全画面起動させる仕組みを実装できたが、iOSでは同様のことは基本的に許可されていない。VoIP通話アプリなど、ごく限られた用途にしか使えない特別な仕組みだからだ。

Critical Alertsという例外

そんなiOSにも、唯一の例外がある。「Critical Alerts」という特別な権限だ。

これを取得すると、サイレントモードや集中モードが有効でも、アプリが強制的に音を鳴らすことができる。医療系・安全系のアプリなど、緊急性の高い通知を扱う用途にAppleが用意している仕組みで、通常のプッシュ通知権限とは別に、Apple側の審査・承認が必要になる。

申請してから承認まで、数日〜数週間かかるとされている。気長に待つしかない部分だった。

実装してみて分かったこと

いざ承認が下りてコードに落とし込む段階になって、いくつか学びがあった。

1つ目は、単に「critical」というフラグを立てるだけでは機能しないということ。実際には、通知の設定に「重要度をcriticalにする」という指定に加えて、「これはcritical通知である」という明示的なフラグ、さらに音量の指定まで、複数の設定を組み合わせて初めて動作する。

2つ目は、コード側の設定だけでなく、アプリ起動時にユーザーへ改めて許可を求める必要があるということ。Entitlement(Apple側の権限)とアプリ内での許可リクエストは別物で、両方揃って初めて機能する。

3つ目は、証明書・プロビジョニングプロファイルの更新が必要になるということ。Apple Developer Portal側で新しい権限を有効化しても、ビルドに使う証明書側が古いままだと反映されない。ここは対話的な操作が必要で、自動化ツールに任せきれない部分だった。

これから

実装・ビルド・審査提出までは完了した。あとは実機での検証だ。

これまで「マナーモード中に動画を見ているときだけ、まれに通知が鳴らない」という再現性の低い不具合に悩まされてきた。この対策が本当に効いているか、明日の朝、実際に試してみる。

地味な機能だが、通知が届くかどうかは、こういうアプリの信頼性そのものに直結する部分だと思う。

いいなと思ったら応援しよう!

フローハブリー 個人開発のサーバー代・開発費に充てさせていただきます。 サポートいただけると開発の励みになります🙏