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