【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}の解決法

この記事からわかること

  • SwiftFirebase 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]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

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アプリ(デバイス)に届くようにすることができました。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index