むかしむかし、あるところに会員ログイン, ゲストログイン機能があるサービス開発プロジェクトがあったとさ…。
懸念
- 複数端末を利用しているユーザ
- ゲストログインと会員ログインを行うユーザ
→
同じ端末に2通Push通知が送られてしまわないか?
通常アプリ仕様知識
- アプリインストール時に擬似的なudidを生成して端末に保存しておくことで、一意な端末を識別できる
検討
- アプリのリフレッシュトークンが切れる毎にFirebaseへデバイストークンを新規発行させる関数がSDKへないか確認
→あればおしまい。 - APIサーバ側で同一のデバイストークンが2つ以上あれば、Distinctをかければ良いのではないか?
→そらそうじゃ
調査
- Firebase SDKにデバイストークンを新規で再生性する関数がないか確認する
見つかった
iOS
リフレッシュトークンが切れた時に下記を行う
リフレッシュトークンが切れる時
- リフレッシュトークンが有効期限切れ
- ログアウトを行った
- デバイストークンをアプリ上で削除する
let instance = InstanceID.instanceID() instance.deleteID { (error) in print(error.debugDescription) }
- 新規でデバイストークンを取得する
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通知送信
- Push通知を送信する際にudidでdistinctを行う
udid user_id role device_token A 1 guest aaa B 3 guest ddd - Push通知送信
device_tokenをFirebaseに送信する
疑問
udidいるの?
次回調査課題
- device_tokenが作成された時に前のdevice_tokenはFirebase上で無効化されるか?
- Firebaseからエラー通知が管理サーバにくるか?
2-1. 古いdevice_tokenを利用した時
2-2. 無効化されたdevice_tokenを利用した時
週明けに確認してもらいたい!