8

サービスのユーザーがアプリからログアウトしたときに、デバイスのプッシュ トークンを確実に無効化 (サーバー上のユーザー プロファイルから削除) するにはどうすればよいですか?

ユーザー プロファイルに apns トークンを含む文字列の配列を保持し、ユーザーが特定のデバイスでプッシュ通知を有効にするたびに 1 つ追加します。

後で、プッシュ トークンはデバイスに固有のものであることに気付きましたが、内部ユーザー アカウントについては明らかに何も知らないため、あるユーザーがログアウトし、別のユーザーが (同じデバイスで) ログインすると、それぞれが同じトークンを持っています。次に、デバイスの現在のユーザーは、それらのいずれかに向けられたプッシュ通知を受け取ります。

基本的な解決策は、ログアウト時にユーザー プロファイルからデバイスのトークンを削除することですが、次のように考えると、多くの落とし穴があります。

  1. ログアウトはネットワーク アクセスを必要とすべきではありません– サーバーへの通知を試みることはできますが、ユーザーがネットワーク アクセスを持っていない場合でも、ログアウトを非同期的に成功させる必要があります (?)
  2. 実際のデバイス トークンは不明である可能性があります。ユーザーが一時的にプッシュ許可を遮断した場合、現在のトークンは提供されません。また、identifierForVendor はインストールごとに変更され、UDID メソッドは推奨されないため、デバイス<->キー情報の保存はせいぜい希薄に見えます。
  3. サーバー側の一意化を行います (アカウントにトークンを追加するときは、同じトークンが他のアカウントに設定されていないことを確認してください)。これは、2 番目のユーザーのログインに依存しますが、これは保証されません。

見落としているエッジ ケースは他にもありますか? また、それらを回避するためにどのような戦略を使用できますか?

4

2 に答える 2

4

あなたの落とし穴は、あなたが直面する可能性のある困難な状況のいくつかを示しています. プッシュ送信ロジックが完全にサーバー側にあることを確認するか、シフトすることをお勧めします。プッシュトークンを選択したユーザー識別子にリンクします (つまり、1 つのプッシュトークンを複数のユーザーにリンクできます)。制御するこの識別子は、プッシュを送信する必要があるときに対象となるアカウント識別子になります。このようにして、どのユーザーが通知を受信し、この識別子に基づいてプッシュトークンを取得するかを制御できます (1 デバイス = 1 ユーザーと想定する Apple が提供するデバイス識別子とは対照的です)。

ユーザーがオフラインでログアウトした場合、それについてはわかりません。そのユーザーに通知を送信できます。ユーザーがそれに基づいて行動することを選択した場合、アプリが開き、その時点でサーバーからユーザー識別子の登録を解除できます (この時点で明らかにオンラインであるため)。

于 2013-11-02T00:25:45.760 に答える
0
  1. アプリがデバイスで初めて実行されると、uuid (Universally unique id) が生成され、NSUserDefaults を使用してデバイスに保存されます

    NSString *uuid = [[NSUserDefaults standardUserDefaults] objectForKey:@"app_uuid"];

    if(uuid == nil){
        uuid = [[NSUUID UUID] UUIDString];
        [[NSUserDefaults standardUserDefaults] setObject:uuid forKey:@"app_uuid"];
        [[NSUserDefaults standardUserDefaults] synchronize];
    
    }
    

    この uuid は、ユーザーが使用してログインしている一意のアプリケーション インスタンスを識別するために使用されます (ユーザーが同じユーザー ID で複数のデバイスにログインできるようにする場合)。

  2. 次に、トークンをサーバーに送信するたびに、ユーザー ID とアプリ uuid を送信します。サーバー側では、アプリの uuid が既に存在するかどうかを確認し、存在する場合は新しいトークンとユーザー ID でタプルを上書きし、存在しない場合は、ユーザー ID、トークン、uuid で新しいタプルを作成して保存します。

  3. 特定のユーザーに通知を送信するときに、ユーザー ID を持つすべてのタプルを取得し、それらからトークンを取得し、これらのトークンを使用して通知を送信します。

于 2016-09-12T10:49:05.893 に答える