iOS7でプッシュ通知にもいくつかの機能追加が加えられていますが、おそらくドキュメントに書かれていないことで、場合によっては問題が生じるかもしれない変更が加えられているようです。
Appleのドキュメント → Local and Push Notification Programming Guide
プッシュ通知のデバイストークンは端末ごとに一意
感覚的には、プッシュ通知のデバイストークンは、取得メソッドを呼んだ時にアプリごとに生成されているように思います。しかし、実際にはアプリごとに異なるデバイストークンが取得されるわけではなく、同じ端末ならばどのアプリから取得しても同じデバイストークンが取得されるようです。
Stack Overflowなどでも、「デバイストークンってアプリごとに違うんですか?」「アプリが違っても同じトークンです」みたいなやりとりがされています。
Is the APN Device Token unique to each individual app?
ぼくが使っている開発端末でデバイストークンを取得すると、どのアプリでも「a2865222…」というデバイストークンが返ります。
どのアプリでも同じデバイストークンだからと言って「他のアプリに対して勝手にプッシュ通知が送れる」ということはありません。プッシュ通知には、アプリに対応する証明証が必要だからです。
debugビルドとreleaseビルドでは異なる
唯一デバイストークンが変わるのは、アプリのビルド設定がdebugビルドの場合です。プッシュ通知の証明証もdebugビルド用と、releaseビルド用が分かれていて、ビルド設定が違うとプッシュ通知は送信できません。
とはいえ、一般のユーザーが使うアプリはすべてreleaseビルドなので、実質的に「デバイストークンは1つの端末に1つだけ」です。
・・・iOS6までは。
iOS7でアプリごとにデバイストークンが変わるようになった
iOS7ではプッシュ通知のデバイストークンがアプリごとに変わるようになったようです。
先ほどの端末のデバイストークンは、アプリ「My365」では「be2c687a…」に、アプリ「ピプル」では「2ba302bc…」になりました。
Appleは、UDIDを利用するアプリの制限を強めて、最近遂にUDIDを取得するアプリは審査に出せなくなりました。プッシュ通知のデバイストークンも端末ごとに一意だったため、UDID的な使い方ができてしまうことも、この変更の理由かもしれません。
iOS7リリース以降続々と新しいトークンが登録
iOS7のリリース後に、データベースを確認してみると、アップデートしたと思われる端末から続々と新しいデバイストークンが登録されています。
iPhoneアプリでは、今までは「1つの端末について1つのデバイストークンしか生成しない」という実装で、OSのアップデートがあってもそのデバイストークンは変化しませんでした。今回のiOS7へのアップデートでは、今までのデバイストークンとは別の新しいデバイストークンが生成され、アプリごとに異なる値となりました。
デバイストークンの扱いで少し凝ったことをしている場合などは、問題が起きるおそれもあるので、確認する必要があるかもしれません。
ちなみに、サーバに2つのデバイストークンが登録されると「2回通知が送られてしまうのではないか」という不安を抱きますが、iOS7のβバージョンの履歴にこれを制御したという内容がありますので、その心配はなさそうです。(未確認)
(※ 仕様に書かれていないですし、OSバージョンを行き来しての検証が難しいため、詳細で確実な調査はしていません。もし違う現象が得られたり、公式の仕様などをご存知の方がいたら教えてください。)
プッシュ通知サービスGrowthPushの対応しました
GrowthPushが、デバイストークンの扱いで少し変わったことをしていて、それがiOS7だと機能しないという報告を受けて調査と対応をしました。
GrowthPush
こちらのサービスはリリースして1ヶ月になりましたが、続々と導入いただいていて、ご満足いただけるようにますます解析と配信の機能の拡張を加速させていく所存であります!
コメント
[…] iOS7でプッシュ通知のデバイストークンに大きな変更 […]