【Swift/Firebase】Error Domain=com.google.fcm Code=505 "No APNS token specified before fetching FCM Token" UserInfo={NSLocalizedFailureReason=No APNS token specified before fetching FCM Token}の解決法

この記事からわかること
- SwiftでFirebase Cloud Messaging導入時に発生したエラーの解決方法
- Error Domain=com.google.fcm Code=505 "No APNS token specified before fetching FCM Token" UserInfo={NSLocalizedFailureReason=No APNS token specified before fetching FCM Token}の原因
- プッシュ通知が届かない場合の対処法
index
[open]
\ アプリをリリースしました /
FCMでリモートプッシュ通知を実装時に発生したエラー
iOSアプリ開発時にFirebase Cloud Messagingを使用してリモートプッシュ通知を実装中に以下のようなエラーが発生してしまいました。
Error Domain=com.google.fcm Code=505 "No APNS token specified before fetching FCM Token" UserInfo={NSLocalizedFailureReason=No APNS token specified before fetching FCM Token}
このエラーが起きているせい(?)でリモートプッシュ通知を送信してもアプリ(デバイス)に届きませんでした。
またこのエラーはXcodeのデバッグエリアに表示されていたもので、表示していたコードはFCMドキュメントに記載されている「トークンを取得する部分のコード」で発生していました。
FCMドキュメント:Apple プラットフォームで Firebase Cloud Messaging クライアント アプリを設定する
Messaging.messaging().token { token, error in
if let error = error {
print("Error fetching FCM registration token: \(error)")
} else if let token = token {
print("FCM registration token: \(token)")
self.fcmRegTokenMessage.text = "Remote FCM registration token: \(token)"
}
}
エラーの原因
翻訳してみると以下のようになります。
エラー Domain=com.google.fcm Code=505 「FCM トークンをフェッチする前に APNS トークンが指定されていません」 UserInfo={NSLocalizedFailureReason=FCM トークンをフェッチする前に APNS トークンが指定されていません}
Firebase Cloud Messagingを利用したリモートプッシュ通知を利用するにはFCMトークンとAPNSトークンの2つが必要になります。今回悪さをしているのはAPNSトークンのようでした。
解決方法
FCMドキュメント:実装入れ替えが無効な場合の APNs トークンと登録トークンとのマッピング
「トークンを取得する部分のコード」の前に明示的にAPNsトークンをFCM登録トークンにマッピングする
解決したコードは以下の通りになります。またこちらはinterfaceを「Storyboard」で実装している場合の「AppDelegate.swift」への記述内容です。
func application(_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
Messaging.messaging().apnsToken = deviceToken
Messaging.messaging().token { token, error in
if let error = error {
print("Error fetching FCM registration token: \(error)")
} else if let token = token {
print("FCM registration token: \(token)")
self.fcmRegTokenMessage.text = "Remote FCM registration token: \(token)"
}
}
}
これで無事自身のFCM registration tokenを確認でき、リモートプッシュ通知もiOSアプリ(デバイス)に届くようにすることができました。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。