回答:
[アップルドキュメントApplePushService] 2
トークン信頼のこのフェーズの形式により、APNのみがトークンを生成し、後でそれが受け入れられるようになります。また、デバイスから渡されたトークンが、その特定のデバイスに対して以前にプロビジョニングしたトークンと同じであることを確認できます。そのデバイス用。
ユーザーがバックアップデータを新しいデバイスに復元するか、オペレーティングシステムを再インストールすると、デバイストークンが変更されます。
この点については、Appleの公式ドキュメントは不明です。私が観察したのはこれです。トークンは、特定のデバイス、アプリケーション、およびドメイン(製品版とサンドボックス)に対して不変です。システムが確実に機能するためには、これが真実である必要があると思います。アプリケーションの更新が新しいAPNトークンをトリガーする状況を考えてみましょう。最高の新しいTwitterのようなアプリを使用していて、通知が有効になっている場合、iTunesからアプリを更新するとどうなりますか?更新を自分のデバイスに「同期」してからアプリケーションを実行していなくても、通知が引き続き送信されることを期待する必要がありますか?更新されたアプリを実行していなくても、OSがユーザーに代わって通知を受信できるため、アプリケーションを変更してもAPNシステムには影響しません。
明確にするために、Appleは「アプリケーションは起動するたびに[APNサーバーに]登録し、そのプロバイダーに現在のトークンを与える必要がある」と述べています。 私は心から同意します。そうすることで、アプリケーションを誤った想定や異常な状況から保護します。
1つのデバイスのすべてのアプリでプッシュ通知トークンは一意ですか?デバイストークンが「オペレーティングシステムのインストール」ごとに一意であることを示します。バックアップからデバイスに復元するとトークンは維持されますが、デバイスをワイプすると新しいトークンが取得されます。これは、シームレスな操作とプライバシーのAppleの意図と完全に一致します。デバイスのワイプは、おそらく新しい関連付けを保証するほど深刻ですが、OSの更新後にイメージを復元するユーザーは、既存の通知を保持する必要があります。iPadでの最近のiOS5アップデートを思い出すと、アップグレード後に最新のバックアップを復元したので、これにより通知トークンの一貫性が維持されます。[編集:別のバックアップを復元する デバイスはトークンを複製しません。]
注意:私はこの件に関して明確な知識は持っていませんが、APNを使用した(サードパーティの開発者として)の合理的な経験があります。いつものように、仮定を確認するのが最善です。
最近、私はa>アップルのエンジニアと話し、b>実世界のテストを実行する機会がありました。その結果を提示したいと思いました。
完全にするために、APNトークンを返すことについて話すとき、私は単一のバンドル識別子/アプリケーションのコンテキストを想定しています。
まず、Appleのエンジニアは、2つのデバイスが同じAPNを返すことは不可能であるべきだと述べました。以下のコメントにもかかわらず、私はこれが失敗する状況を特定できませんでした。
次に、アップグレードテストのシーケンスと結果を示します。
iPhone4にインストールされているiOS4から始めます。iTunesのバックアップデバイス
iOS5へのアップグレード
以前のテストから、APNトークンが異なることがわかりました
バックアップをデバイスに復元する
APNトークンはステップ1と同じです。
iOSのリセット(デバイスのクリーン)
APNトークンの変更
別の電話をiTunesにバックアップし、そのバックアップをテストデバイスに復元します。基本的に、電話を切り替えたかのように、「間違った」バックアップを復元しています。
APNトークンが再び変化します。さらに、それは明確であり、元のトークンまたは「クローン」トークンのいずれにも一致しません。
「正しい」バックアップをデバイスに復元します。
APNトークンはステップ1と同じになりました。
最後に、電話をiOS6(beta2)にアップグレードし、バックアップを復元して、再テストしました。予想通り、トークンはステップ1のトークンと一致し続けました。
この時点で、APNトークンを異なるデバイス間で複製することはできないと確信しています。これは以前のバージョンのiOSのバグとして発生した可能性がありますが、iOS5(およびおそらくiOS6)がAPNトークンを正しく処理していると確信しています。
これを追加していないことに気づきました。デバイストークンが変更されます。アップルの開発者の1人が私と共有し、トークンは実際に期限切れになると思います(2年後に、私は思う)多くの目的で、これは十分に長く、不変であると考えることができます。
[特に毎年電話を交換するため、テストスクリプトを2年ごとに新しいトークンで更新する必要があるかどうか心配していません。]
アプリを再インストールした場合、iOS9とAPNプッシュトークンの変更でテストしました。
はい、デバイストークンは変更できます。
アプリがトークンを受け取るときはいつでも、それを保存する必要があります。次に、新しいトークンを受け取るたびに(最終的には発生します)、新しいトークンを格納されているトークンと比較し、異なる場合は次のようにします。
nil
)実際問題として、最後のステップは自明ではない可能性が最も高いです。あなたは、デバイスが加入したことを郵便番号ものに基づいてトークンデバイスに気象警報を送信しているサービスを持っている場合たとえば、あなたは合格する必要がありますold_token
し、new_token
それは配達を更新できるようにサービスを語りました。
Ergoは、一般的に言って、「デバイストークン」を受け入れる100%のAPIにもUPDATE
、そのトークン用の何らかの機能が必要です。このために構築しないとは、誤配信された通知と配信されなかった通知のために構築することです。
デバイストークンはiOS 8以降から変更されます
アップルのウェブサイトから以下のテキストをご覧ください。ユーザー通知の登録、スケジュールおよび処理
デバイストークンは、特定のデバイス上のアプリにプッシュ通知を送信するための鍵です。デバイストークンは変更される可能性があるため、アプリを起動するたびに再登録して、受信したトークンをサーバーに返す必要があります。デバイストークンの更新に失敗した場合、リモート通知がユーザーのデバイスに届かない可能性があります。ユーザーがバックアップデータを新しいデバイスまたはコンピューターに復元するか、オペレーティングシステムを再インストールすると、デバイストークンは常に変更されます。新しいデバイスまたはコンピューターにデータを移行する場合、リモート通知をそのデバイスに配信する前に、ユーザーはアプリを1回起動する必要があります。
あなたがを呼んだ後でトークンが変わるのは誰もやっていなかったので、言及する価値があると思いますunregisterForRemoteNotifications
。registerForRemoteNotifications
次回呼び出すときにトークンが異なります。私はAppleのドキュメントでこれの確認を見つけることができませんでしたが、私はそのような行動を自分で目撃しました。これを覚えておいてください
アプリが新しいデバイスに復元されない限り、変更されることはありません(この時点で、プッシュ通知を再び受け入れるように求められることはなく、新しいトークンを受け入れる必要がある時点で登録済みの呼び出しが送信されるだけです)。
しかし、Appleはそれが変更されないことを保証しません(そのため、ドキュメントはそれについて決して言及しません)。最悪の場合はプログラムを改善し、それが1日で変わる可能性があると想定します。また、定期的にサーバーにトークンを送信すると、しばらくの間登録されておらず、おそらくアプリをアンインストールしたり、しばらく前に興味を失ったりしたトークンを削除できます(ドキュメントでは、これを望ましい動作として指定しています!)。
差出人-Apple Docs
APNはさまざまな理由で新しいデバイストークンを発行できます。
ユーザーがアプリを新しいデバイスにインストールする
ユーザーがバックアップからデバイスを復元する
ユーザーがオペレーティングシステムを再インストールした
その他のシステム定義のイベント
その結果、アプリは起動時にデバイストークンを要求する必要があります。
さらに:
重要
APNsデバイストークンは可変長です。サイズをハードコーディングしないでください。
リンクはすぐにAppleで時代遅れになります!だから私は今かなりはっきりしているように見えるものを引用しています:
アプリにデバイストークンをキャッシュしないでください。代わりに、必要なときにシステムから取得してください。APNは、特定のイベントが発生すると、アプリに新しいデバイストークンを発行します。たとえば、ユーザーがバックアップからデバイスを復元したとき、ユーザーが新しいデバイスにアプリをインストールしたとき、ユーザーがオペレーティングシステムを再インストールしたときなど、デバイストークンは異なることが保証されています。キャッシュに依存するのではなく、トークンをフェッチすることで、プロバイダーがAPNと通信するために必要な現在のデバイストークンを確実に取得できます。デバイストークンをフェッチしようとしたが変更されていない場合、fetchメソッドはすぐに戻ります。
基準として、 Appleのプッシュ通知のもの
デバイストークンは、特定のデバイス上のアプリにプッシュ通知を送信するための鍵です。デバイストークンは変更される可能性があるため、アプリを起動するたびに再登録して、受信したトークンをサーバーに返す必要があります。デバイストークンの更新に失敗した場合、リモート通知がユーザーのデバイスに届かない可能性があります。ユーザーがバックアップデータを新しいデバイスまたはコンピューターに復元するか、オペレーティングシステムを再インストールすると、デバイストークンは常に変更されます。新しいデバイスまたはコンピューターにデータを移行する場合、リモート通知をそのデバイスに配信する前に、ユーザーはアプリを1回起動する必要があります。
デバイストークンをキャッシュしないでください。必要なときにいつでもシステムからトークンを取得します。アプリが以前にリモート通知に登録されている場合、registerForRemoteNotificationsメソッドを再度呼び出しても追加のオーバーヘッドは発生せず、iOSは既存のデバイストークンをアプリデリゲートにすぐに返します。さらに、iOSは、アプリの登録または再登録への応答だけでなく、デバイストークンが変更されるたびにデリゲートメソッドを呼び出します。
このリンクによると、デバイストークン
各リクエストに含まれるデバイストークンは、通知を受信するデバイスのIDを表します。APNは、デバイストークンを使用して、一意のアプリとデバイスの組み合わせをそれぞれ識別します。また、それらを使用して、デバイスに送信されるリモート通知のルーティングを認証します。アプリがデバイスで実行されるたびに、APNからこのトークンがフェッチされ、プロバイダーに転送されます。プロバイダーはトークンを保存し、その特定のアプリとデバイスに通知を送信するときにトークンを使用します。 トークン自体は不透明で永続的であり、デバイスのデータと設定が消去された場合にのみ変更されます。APNのみがデバイストークンをデコードして読み取ることができます。
はい、変更できます。理想的には、コールバックメソッドを介してトークンを受け取るとき
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
アプリはリモートサーバーでトークンを登録/更新する必要があります。これにより、APNSとサーバーのトークンが確実に同期されます。
あたりとして、アップルのドキュメント、
アプリ固有のデバイストークンの取得と処理は次のように機能します。
アプリはリモート通知用のAPNに登録します新しいデバイストークンが必要になると、APNはデバイスの証明書に含まれる情報を使用してトークンを生成します。中央の右向き矢印に示すように、トークンキーを使用してトークンを暗号化し、デバイスに返します。システムは、application:didRegisterForRemoteNotificationsWithDeviceToken:delegateメソッドを呼び出して、デバイストークンをアプリに戻します。トークンを受け取ると、アプリ(デリゲートメソッド内)は、トークンをバイナリ形式または16進数形式でプロバイダーに転送する必要があります。このトークンがないと、プロバイダーはデバイスに通知を送信できません。詳細については、「リモート通知サポートの構成」の「リモート通知を受信するための登録」を参照してください。
アプリのインストール時のデバイストークンリレー。
つまり、アプリケーションを再インストールすると、アプリケーションが変更されます。バックアップ、iOSアップグレードeccから実行しても、それは改善されません。
問題を回避するためにそれを使用する正しい方法NSPAppDelegate
は、メソッドで、各アプリケーションの起動時に指定されたものを取得することですdidRegisterForRemoteNotificationsWithDeviceToken