Edited at

iOS8アップデートでアプリへのプッシュ通知でハマる点

More than 5 years have passed since last update.

iOS7対応で既に盛大に苦しんだ方はハマってないはずですが…

iOS8でAPNsへデバイス登録する際のメソッドが変わった、とは別の話です。

※予めお断りしておきますが、検証は各自でお願いします。

(自分はiOS Appのdeveloperでもなんでもないです)


iOS8アップデートとプッシュ通知

アプリをインストールした状態でiOSをアップデートした場合にプッシュ通知でハマる場合がある


こんなアプリがハマる

アプリ内部にデバイストークンが無い場合のみAPNsにデバイス登録&トークン発行するアプリ

(実質、初回起動時のみしかデバイス登録しないタイプのアプリ)


なぜハマるか

iOSアップデート後、再度APNsへのデバイス登録を行わなければプッシュ通知が行えない

※ちなみに再登録後のデバイストークンはiOSアップデート前と同じ

なので、APNsへのデバイス登録が必要なのだが、上記のハマるタイプのアプリでは、

iOSアップデートしてもアプリの内部データはそのままのため、

内部にトークンがあると認識しているので再度のデバイス登録は行わない

つまり、再度デバイス登録を行いたいのに、そのためのトリガーが無いという状態になる


必要な対応

再度デバイス登録を行うためのトリガーを、内部デバイストークンの有無とは別に設計する

公開がiOSアップデートに間に合わなかった場合はアプリのアップデートで対応する


AWSのSNSで通知を送っている場合

盛大に二重にハマる可能性がある


こんなサーバサイドアプリがハマる

上記iOS8対応が後手になってしまった場合、かつ、

再インストール/リセマラ対策してないサーバサイドアプリ

(get-endpoint-attributes→delete-endpoint→create-platform-endpoint)


なぜハマるか

SNSでは、何度か通知に失敗した場合、endpointがdisableになる

※一度disableになってしまったendpointは、以降どれだけpublishしてもAPNsが叩かれることはない

前述の通り、デバイスを再度APNsに登録した場合でも、デバイストークンは文字列上変化が無いため、SNSのendpointも変化なし

既にendpointがある状態で同一のトークンでcreate-platform-endpointしてもendpointは作り直されないため、disableの状態は続く

iOSアプリ側の8対応が後手になってしまった場合、アップデート公開までにdisableなendpointが大量生産されているはず


必要な対応

再インストール対策を取ると同時に、disableになってしまったendpoint全てについて、

get-endpoint-attributes→delete-endpoint→create-platform-endpointによるendpointの作り直し、または

set-endpoint-attributesでEnabled=trueにして復活させる


追記

改めてPush Notificationプログラミングガイドを読んでみると、

https://developer.apple.com/jp/devcenter/ios/library/documentation/RemoteNotificationsPG.pdf


  • アプリを起動するたびにトークンのリクエスト(デバイス登録)をしなければならない

  • デバイストークンはOSがキャッシュしているのでアプリではキャッシュするべきでない

と書いてあった。。。

とはいえ、ガイド通りに実装していた場合でも周りの様子を察するに、

iOSアップデート後、初回起動(をトリガーとしたデバイス登録が完了する)まで、プッシュ通知は有効にならない様子。