LoginSignup
89
85

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-09-20

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

89
85
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
89
85