Notificationの落とし穴

ClockClipの仕上げで、アプリがバックグラウンドになっても、アラームの時間になったら通知を受け取れるようにしようとして、ハマってました。

時間トリガーの通知が、時間になってもこない

以下のようなコードで、通知を待ってましたが、こない・・・・

試行錯誤

以下のようなサンプルを作って試したところ、うまく動きました。

なぜ、期待通りに動かないか

上記のコードを試したのは、午後2時半すぎでした。DateComponentで指定しているのは、14時と35分です。
このコードはうまく動いたんです。2:35ぴったりに通知がでました。
普通に見えますが、よ〜く考えてみるとDateで保持しているのは、GMTのはずなので、(14-9)=5時と指定しないと、すぐには、表示されないはずです!
ということで、DateComponentには、GMT指定ではなく、ローカル時間で指定しなければいけないのではないか? という仮説を持ちました。

自分のコードでも、即値指定(alarmTimeを参考にせずに、直接数値指定)で動かしたところ、きちんと動きました!! 
つまり、設定すべきは、ローカル時間でした!

UNCalendarNotificationTriggerは、ローカル時間でのDateComponentを期待している

つまり、UNCalendarNotificationTriggerの1番目の引数のDateComponentは、ローカル時間での数値を期待しているということです。
ドキュメントを改めて読み返してみたのですが、そのように書かれている箇所はみつかりませんでした。(そうでないと書いている場所もないのですが)

以下のようなコードを使うことで指定時間に表示することができるようになりました。

# 上記のコードは、ライブラリとして、SwiftDateがないと動作しません。

注意
上記のコードで、最初は、alarmTimeから返されるDateComponentをそのまま使って、Triggerに使っていたのですが、うまくトリガーされませんでした。
なぜかは、不明ですが、新しくDateComponentを作って指定したところうまく動きました。

まとめ

UNNotificationCenterをUNCalendarNotificationTriggerをtriggerとして使うときには、いかに気をつけて指定しないと期待通りに動きませんでした。

  • DateComponentに不要な情報がないようにする。
  • DateComponentに設定する数値は、ローカル時間を指定する必要がある。

念願の通知が表示されるようになって、嬉しい!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です