アプリ内でプッシュ機能を実装するときに必ず必要になってくるデバイストークンですが、取得の仕方を誤るとFCMなどからプッシュを送るときに失敗してしまうので注意が必要です。プッシュを送るときにinvalidregistrationというエラーが出ている方は、プッシュの配信側の問題ではなくデバイストークンの取得方法が誤っていることがあるので見直してみるとよいでしょう。
デバイストークンの取得の方法は検索すると色々出てくると思いますが、その通りにやってもうまくいかないことがあります。SwiftのバージョンやらFirebaseのバージョンによって実装方法が異なってくることがあるので、自分の環境にあった方法を採用しないと必ずはまります。以下の方法はSwift3で動作確認済みです。
AppDelegateに記載します
1 2 3 4 5 6 7 8 9 10 11 |
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { InstanceID.instanceID().setAPNSToken(deviceToken, type: .sandbox) if let refreshedToken = InstanceID.instanceID().token() { print("InstanceID token: \(refreshedToken)") // このようにユーザ情報にデバイストークンを登録してあげると便利 let userRef = Database.database().reference().child("User").child(Auth.auth().currentUser!.uid) userRef.updateChildValues(["deviceToken": refreshedToken]) } } |
2017/08/08追記
本番環境だと上記方法だとうまく動かない現象が確認できました。こちらの方法では動作確認済みです。ご確認下さい。
1 2 3 4 5 6 7 8 9 |
Messaging.messaging().apnsToken = deviceToken if let refreshedToken = Messaging.messaging().fcmToken { print("InstanceID token: \(refreshedToken)") // このようにユーザ情報にデバイストークンを登録してあげると便利 let userRef = Database.database().reference().child("User").child(Auth.auth().currentUser!.uid) userRef.updateChildValues(["deviceToken": refreshedToken]) } |