アプリ

【検討】Firebase ゲストログイン機能とPush通知実装検討

 

むかしむかし、あるところに会員ログイン, ゲストログイン機能があるサービス開発プロジェクトがあったとさ…。

 

懸念

 

  • 複数端末を利用しているユーザ
  • ゲストログインと会員ログインを行うユーザ

同じ端末に2通Push通知が送られてしまわないか?

通常アプリ仕様知識

  • アプリインストール時に擬似的なudidを生成して端末に保存しておくことで、一意な端末を識別できる

 

検討

  • アプリのリフレッシュトークンが切れる毎にFirebaseへデバイストークンを新規発行させる関数がSDKへないか確認
    →あればおしまい。
  • APIサーバ側で同一のデバイストークンが2つ以上あれば、Distinctをかければ良いのではないか?
    →そらそうじゃ

 

調査

  1. Firebase SDKにデバイストークンを新規で再生性する関数がないか確認する

 

見つかった😊

iOS

 

 

リフレッシュトークンが切れた時に下記を行う

リフレッシュトークンが切れる時

  • リフレッシュトークンが有効期限切れ
  • ログアウトを行った

 

  1. デバイストークンをアプリ上で削除する
    let instance = InstanceID.instanceID()
    instance.deleteID { (error) in
        print(error.debugDescription)
    }
  2. 新規でデバイストークンを取得する
    if let token = InstanceID.instanceID().token() {
        print("Token : \(token)");
    } else {
        print(“Error: unable to fetch token");
    }
    
    Messaging.messaging().shouldEstablishDirectChannel = true

    You can get updated token in MessagingDelegate method didReceiveRegistrationToken and in Refresh Token.

    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        print("Firebase Token :  \(fcmToken)")
    }

これでおっけ。

 

こんな風にする

user_devicesテーブル

udid user_id role device_token コメント
A 1 guest aaa ①ゲストログインしてアプリを体験
A 2 general bbb ②アプリがイケてたから本登録したぞ!😊
B 2 general ccc ③もう1台の端末でも利用してみた!
B 3 guest ddd ④ログアウトしてゲストでログインしたぞ
B 4 general eee ⑤複アカを作ったぞ

 

アプリ仕様

  • アプリインストール時に擬似的なudidを生成する
  • リフレッシュトークンが切れた時にdevice_tokenを更新する
    ・リフレッシュトークン有効期限切れ
    ・ログアウト実行時

Push通知送信

  1. Push通知を送信する際にudidでdistinctを行う
    udid user_id role device_token
    A 1 guest aaa
    B 3 guest ddd
  2. Push通知送信
    device_tokenをFirebaseに送信する

 

疑問

udidいるの?

次回調査課題

  1. device_tokenが作成された時に前のdevice_tokenはFirebase上で無効化されるか?
  2. Firebaseからエラー通知が管理サーバにくるか?
    2-1. 古いdevice_tokenを利用した時
    2-2. 無効化されたdevice_tokenを利用した時

週明けに確認してもらいたい!

 

 

 

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)