2013-11-01 12 views
7

サービスからユーザがログアウトしたときに、そのユーザのデバイスのプッシュトークンを確実に無効にする(サーバ上のユーザプロファイルから削除する)ユーザログアウト時にiOSデバイスのプッシュトークンを無効にする

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

私はプッシュトークンがデバイス固有のものであることを理解していましたが、内部ユーザーアカウントは何も分かっていません。したがって、1人のユーザーがログアウトして別のユーザーがログインすると、同じトークンを持ちます。次に、デバイスの現在のユーザーは、いずれかのプッシュ通知を取得します。

基本的なソリューションはログアウト時にユーザープロファイルからデバイスのトークンを削除することですが、私は通過することを考えると、私は落とし穴の束とまで来ている:

  1. ログアウトネットワークを必要とすべきではありませんアクセス - 私はサーバーに通知しようとすることはできますが、ユーザーにネットワークアクセス(?)がない場合でも非同期的に成功するにはログアウトが必要です
  2. 実際のデバイストークンは不明である可能性があります。現在のトークンは与えられません。 identifierFVendorがインストールごとに変更され、UDIDメソッドが非推奨になっているため、保存デバイス< - >重要な情報はあまりないようです。
  3. (アカウントにトークンを追加するときに、他のアカウントに同じトークンが設定されていないことを確認してください) - これはログインしている2番目のユーザーに依存しますが、これは保証されません。

私が紛失しているエッジケースが増えていますか、それらを回避するためにどのような戦略を使用できますか?

答えて

3

あなたの問題は、あなたが直面するかもしれない困難な状況のいくつかを提示します。 push-sendロジックが完全にサーバー側にあることを確認することをお勧めします。選択したユーザー識別子にプッシュトークンをリンクします(つまり、プッシュトークンを複数のユーザーに実際にリンクさせることができます)。あなたが制御するこの識別子は、プッシュを送信する必要があるときにターゲットとするアカウント識別子になります。このようにして、通知を受信し、この識別子に基づいてプッシュトークンを取得するはずのユーザーを制御することができます(Appleが提供する1つのデバイス= 1ユーザーと仮定するデバイス識別子)。

ユーザーがオフラインでログアウトすると、そのことについてはわかりません。そのユーザーに通知を送信する場合があります。ユーザーがそれに対処することを選択した場合、あなたのアプリが開き、その時点で(この時点で彼は明らかにオンラインであるため)サーバーからユーザーIDの購読を解除することができます。

+0

私は最初の段落にはっきりしません。私は基本的に前半を持っています(1つのトークンは複数のユーザーにリンクできます)が、どのユーザーが有効であるかをどのように区別するかはわかりません。おそらく、そのユーザープロファイルに最初に保存されたタイムスタンプのようなものなのでしょうか?最新のものは有効なものでしょうか? – owenfi

+0

オフラインログアウトとそれに続くプッシュ通知に反応することについての点をありがとうございます。それはAPIに与えられた最良のケースのソリューションのように思えますし、注意点について私の喜びを緩和します。 – owenfi

+0

最初の段落について、プッシュトークンをサーバーに保存すると、同時にユーザーIDを送信できます。あなたのサーバは、この時点で、ユーザが有効かどうかを知るでしょう。 私はあなたの質問を正しく理解していませんが...プッシュトークンは生成されたタイムスタンプに関係なく同じです。私はあなたの考えに従っているかどうかわからない – Nick

0
  1. アプリケーションがデバイス上で初めて実行UUID(Universally Unique ID)を生成し、

    NSStringの* UUID = [[NSUserDefaults standardUserDefaults] objectForKey NSUserDefaultsを使用して、デバイス上でこれを保存します:@」 app_uuid "];

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

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

  2. トークンをサーバーに送信するたびに、ユーザーIDとapp uuidを送信します。サーバー側でappuuidが既に存在するかどうかをチェックし、そうであれば新しいトークンとユーザーIDでタプルを上書きし、ユーザーID、トークン、およびuuidで新しいタプルを作成して保存しない場合はそのタプルを上書きします。

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

関連する問題