web-dev-qa-db-ja.com

APNS Firebase Notificationはトークンを取得できませんでした

Swift3/iOS10については、次のリンクを参照してください:

ios10、Swift 3およびFirebase Push Notifications(FCM)

Firebaseを通知に使用しようとしていますが、ドキュメントに記載されているとおりに正確に統合しました。しかし、なぜ機能しないのかわかりません。プロジェクトをビルドすると、次の行が表示されます。

2016-05-25 16:09:34.987: <FIRInstanceID/WARNING> Failed to fetch default token Error Domain=com.firebase.iid Code=0 "(null)"

これは私のAppDelegate:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    FIRApp.configure()
    FIRDatabase.database().persistenceEnabled = true
     var service: DataService = DataService()
    service.start()
    registerForPushNotifications(application)
    application.registerForRemoteNotifications()
    return true
}

func registerForPushNotifications(application: UIApplication) {
    let notificationSettings = UIUserNotificationSettings(
        forTypes: [.Badge, .Sound, .Alert], categories: nil)
    application.registerUserNotificationSettings(notificationSettings)
}

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
    if notificationSettings.types != .None {
        application.registerForRemoteNotifications()
    }
}

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
    var tokenString = ""

    for i in 0..<deviceToken.length {
        tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
    }

    FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Unknown)
    print("Device Token:", tokenString)
}
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)  {
    // Print message ID.
    print("Message ID: \(userInfo["gcm.message_id"]!)")

    // Print full message.
    print("%@", userInfo)
}

1. didFinishLaunchingWithOptionsメソッドで通知オブザーバーを設定します

2.そしてtokenRefreshNotificationメソッドを設定し、このメソッドでトークンを取得します。

以下のコードを参照

import Firebase
import FirebaseMessaging

override func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
  FIRApp.configure()

      NotificationCenter.default.addObserver(self,
                                                     selector: #selector(self.tokenRefreshNotification(notification:)),
                                                     name: NSNotification.Name.firInstanceIDTokenRefresh,
                                                     object: nil)
}

// NOTE: Need to use this when swizzling is disabled
public func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {

  FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenType.Sandbox)
}

func tokenRefreshNotification(notification: NSNotification) {
  // NOTE: It can be nil here
  let refreshedToken = FIRInstanceID.instanceID().token()
  print("InstanceID token: \(refreshedToken)")

  connectToFcm()
}

func connectToFcm() {
  FIRMessaging.messaging().connectWithCompletion { (error) in
    if (error != nil) {
      print("Unable to connect with FCM. \(error)")
    } else {
      print("Connected to FCM.")
    }
  }
}

public func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
  print(userInfo)
}
13
Sanandiya Vipul

私も同じ問題を抱えていて、何もうまくいきませんでした。しかし、あなたがしなければならないのは、Firebaseコンソールに移動して、プロジェクトを見つけ、その設定に移動することです。そこで、クラウドメッセージングタブを確認し、そこに.p12証明書をアップロードします。

それでおしまい!ハッピーコーディング:)

22
starlord_amj

1-Googleのドキュメントで指定されているように証明書を正しく構成しましたか(ここでプロセスを思い出せませんが、かなり長いです...)? ( https://firebase.google.com/docs/cloud-messaging/ios/certs#configure_an_app_id_for_Push_notifications

2-FCMのセットアップ時にいくつかの困難を経験しました。すべてが大丈夫だと思ったが、通知がまだ機能していなかったので、電話からアプリを完全に削除し、ビルドフォルダーをクリーンアップして、すべてを再インストールすることにしました。その後、動作していました。

3-アプリは通知を受信して​​いましたが、「デフォルトトークンを取得できませんでした...」というメッセージがまだ表示されていました。しばらくして消えました。理由を聞かないで!

これは実際には適切な答えではありません。通知を設定するのは簡単ではなく、すべての手がかりが歓迎されることを知っているので、自分の経験を共有するだけです。したがって、これが役立つ場合があります。乾杯:)

4
Moose

上記のすべて(および他の場所で見つけることができるもの)をすべて試した後、私にとって問題を解決するのは、

let token = FIRInstanceID.instanceID().token()

アプリの読み込み時ではなく、ボタンを押したときに呼び出されます。

おそらく最もエレガントなソリューションではないことは承知していますが、デバッグの目的には十分です。サーバーがトークンをすぐに利用できないと推測し、生成に時間がかかります。

3
michael chein

FCMは私のために働いていたが、その後停止した。 Rabs G.が提案したことを実行してアプリを削除し、再度インストールすると、通知が再び機能し始めました。

2
Ro4ch

上記の回答は問題のほとんどをカバーしていますが、同じ問題があり、次の情報が役立ちました。

  1. Firebaseは、いつでもユーザーのFCMトークンを'rotate'(変更)できます。これは、サーバーがプッシュ通知をデバイスに送信するために使用する128文字のIDです。

  2. Firebaseのドキュメントによると、ベストプラクティスはデリゲートを使用して、デリゲートコールバックメソッドで変更を監視することです。

    - (void)messaging:(nonnull FIRMessaging *)messaging didRefreshRegistrationToken:(nonnull NSString *)fcmToken
    

[Obj-C]

func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String)

[迅速]

デリゲートメソッドは、すべての変更で呼び出される必要があります。この時点で、サーバーのレコードを更新できます。

  1. 残念ながら、それは私にとってはうまくいきませんでした。私にはデリゲートがありましたが、コールバックは呼び出されていませんでした。そのため、次のように、各アプリの起動時にトークンを手動で更新することに頼らなければなりませんでした(上記の@micheal cheinが示唆したとおり)。

    NSString *deviceToken = [FIRInstanceID instanceID].token; // Send this to your server
    

    [Obj-C]

    let token = FIRInstanceID.instanceID().token() // Send this to your server
    

    [迅速]

**重要:回転はしばらくしてから反映される場合があるため、遅延(20〜25秒)後にトークンを更新します。これにはタイマーを使用できます。

  1. この後、APNS警告/エラーメッセージが表示されます。

    2017-06-06 09:21:49.520: <FIRInstanceID/WARNING> Failed to fetch APNS token Error Domain=com.firebase.iid Code=1001 "(null)"
    

[〜#〜] but [〜#〜]、プッシュ通知は毎回必ず機能します。したがって、ログメッセージは少しずれている(タイミングが間違っている可能性がある)と思います。あなたがあなたのために働くためにオプション2を得ることができるならば、間違いなくそれをしてください!

2
Peza