iOS 9からAPNsデバイストークンがアプリインストールの度に変わるようになったようです

  • 220
    いいね
  • 1
    コメント

iOSのAPNSデバイストークンの変更タイミングは不定で、APNsデバイストークンのハンドリング(通知サーバーへのデバイストークン伝達など)は、アプリが起動される度に毎回行うことが推奨されています。

とはいえ、観測・実験ベースで、変更タイミングが大体分かっていて、この記事など参考になります(iOS 8までの挙動)。

iOS 7にアップデートのタイミングで変わるようですが、iOS 8・9へのアップデートのタイミングで変わるかは把握していません。

繰り返しになりますが、下記のように変更タイミングは不定と明記されているので、ロジック自体はそれに頼らずに組むべきです。

Never cache device tokens in your app; instead, get them from the system when you need them. APNs issues a new device token to your app when certain events happen. The device token is guaranteed to be different, for example, when a user restores a device from a backup, when the user installs your app on a new device, and when the user reinstalls the operating system. Fetching the token, rather than relying on a cache, ensures that you have the current device token needed for your provider to communicate with APNs. When you attempt to fetch a device token but it has not changed, the fetch method returns quickly.
Local and Remote Notification Programming Guide: Configuring Remote Notification Support

具体的には、以下の処理が基本です。

  1. アプリが起動される度に、通知が許可されていれば毎回registerForRemoteNotificationsメソッドを呼ぶ
  2. デバイストークン取得タイミングでapplication:didRegisterForRemoteNotificationsWithDeviceToken:が呼ばれる
    • このメソッドが呼ばれる度にそのデバイストークンを用いて適切にハンドリング
    • 仮にアプリ起動中に変更されても再度呼ばれる(このパターンは今まで観測したことないですが)

上記踏まえた上で、実際問題iOS 9以降のデバイストークンがどのように変わるのか、観測ベースで説明します。

iOS 9からはAPNsデバイストークンがアプリインストールの度に変わる模様

iOS 9からはアプリをインストールし直す度に、UIApplicationのこのメソッドを初めて呼んだタイミングで通知確認ダイアログが表示されるようになりました。

public func registerUserNotificationSettings(notificationSettings: UIUserNotificationSettings)

Untitled.png

さらに、こちらに渡されるdeviceTokenも変わることを確認しています。

func application(application: UIApplication!, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData!)

これによる影響は?

基本的には、開発しやすくなると思っています。

今まで、通知確認ダイアログを再表示するには、端末をリセットしたり、時間ズラして再表示させる技など、使う必要があって面倒でした。

参考: iphone - Reset push notification settings for app - Stack Overflow

さらに、デバイストークンが変わるような状態を再現となると、冒頭に書いたとおりさらに大変になります。

シミュレーターの場合は、簡単に端末リセットが出来るのでダイアログを出すことまでは簡単ですが、そもそも通知はシミュレーターには届かなかったりで一貫した確認が出来ませんし、最終的には実機での確認もしたいところですし。

それらの苦労が無くなり、アプリを再インストールするだけで再現出来るようになるので、かなり捗るかと思っています。

気になることとしては、今までよりもデバイストークンの変更頻度が増えて無効なデバイストークンの増加ペースが上がるので、そのあたりの処理をこれまでよりきちんとしていかないと良くないと思います。