APNS Firebase 通知未能获取令牌

Posted

技术标签:

【中文标题】APNS Firebase 通知未能获取令牌【英文标题】:APNS Firebase Notification failed to fetch token 【发布时间】:2016-09-23 03:08:10 【问题描述】:

对于 Swift3 / iOS10,请参阅此链接:

ios10, Swift 3 and 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)

【问题讨论】:

实现 didFailToRegisterForRemoteNotificationsWithError 并查看它是否被调用,如果是,错误代码是什么。我想您为 apns 启用了应用的配置文件? @SausageModulationMatrix 它没有达到那个功能 你找到解决方案了吗 有什么解决办法吗? 检查您的代码签名身份。它对我有用。 【参考方案1】:

我也有同样的问题,但对我没有任何帮助。但是您所要做的就是转到您的 firebase 控制台,然后找到您的项目并转到其设置,在其云消息传递选项卡中检查并将您的 .p12 证书上传到其中。

就是这样!快乐编码:)

【讨论】:

最初我只在 firebase 控制台上添加了开发证书。即使那样我也得到了错误。然后我也添加了生产证书,它让注册成功并授予令牌。所以根据我的情况,我们需要两个证书。添加到 Firebase 控制台。 我必须这样做。上传后让我现在检查一下。【参考方案2】:

1.在didFinishLaunchingWithOptions方法中设置通知观察者

2.并设置tokenRefreshNotification方法然后你在这个方法中获取Token。

见下方代码

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)

【讨论】:

【参考方案3】:

1 - 您是否按照谷歌文档中的说明正确配置了您的证书(我不记得这里的过程,它很长......)? (https://firebase.google.com/docs/cloud-messaging/ios/certs#configure_an_app_id_for_push_notifications)

2 - 我在设置 FCM 时遇到了一些困难。一旦我认为一切正常但通知仍然不起作用,我决定从手机中完全删除该应用程序,清理我的构建文件夹并重新安装整个东西。之后,它就开始工作了。

3 - 应用程序正在接收通知,但我仍然收到“无法获取默认令牌...”消息。过了一会儿就消失了。不要问我为什么!

这不是一个真正的正确答案,我只是分享我的经验,因为我知道配置通知并不容易,欢迎提供所有线索。所以也许这个可以提供帮助。干杯:)

【讨论】:

我遇到了 FCM 问题并删除了应用程序,然后清理并构建了对我有用的项目。【参考方案4】:

在尝试了以上所有方法(以及我在其他地方可以找到的任何方法)之后,解决问题的方法就是搬家

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

在按下按钮时调用,而不是在应用加载时调用。

我知道这可能不是最优雅的解决方案,但它足以用于调试目的。 我猜服务器无法立即使用令牌,并且需要一些时间才能生成。

【讨论】:

我遇到了同样的问题,我的问题是在调用 FIRApp.configure() 之前尝试注册通知(没有充分的理由)。当我更改时,我在 AppDelegate 中获得了令牌 哇,非常感谢!我在 appDelegate 中调用了 FIRApp.configure(),并尝试在第一个视图控制器的 viewDidLoad 中获取令牌。我从来没有想过 FIRApp.configure 没有被调用。我将我的代码(只是将令牌更新到我的服务器)移动到 appDelegate,它运行良好。 :)【参考方案5】:

上面的答案涵盖了大部分问题,但我遇到了同样的问题,我发现以下信息很有用:

    Firebase 可以随时'轮换'(更改)用户的 FCM 令牌。这是您的服务器将用于向设备发送推送通知的 128 个字符的 ID。

    Firebase 文档说最佳做法是使用委托通过委托回调方法监控更改:

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

[对象-C]

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

[斯威夫特]

应该在每次更改时调用委托方法,此时您可以更新服务器中的记录。

    不幸的是,这对我不起作用,我有一个委托,但没有调用回调。因此,我不得不在每次应用启动时手动更新令牌(如上面@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 秒)后更新令牌,因为轮换有时只能在一段时间后反映。您可以为此使用计时器。

    在此之后,我仍然收到 APNS 警告/错误消息:

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

但是,推送通知每次都能正常工作。所以我认为日志消息有点不对劲(可能时间不正确)。如果您可以让选项 2 为您工作,那么一定要这样做!

【讨论】:

FCM 令牌的轮换可能发生在以下情况: 应用程序在新设备上恢复;用户卸载/重新安装应用程序;用户清除应用数据。【参考方案6】:

FCM 为我工作,然后就停止了。我按照 Rabs G. 的建议做了,删除了该应用程序并重新安装,通知又开始工作了。

【讨论】:

即使做了很多次,这个技巧对我也没有用。

以上是关于APNS Firebase 通知未能获取令牌的主要内容,如果未能解决你的问题,请参考以下文章

错误无法获取 APNS 令牌错误域 = com.firebase.iid 代码 = 1001“(空)”

Cordova 应用程序的 Firebase - 无法获取 APNS 令牌

ios 应用更新后未收到 Firebase/APNS 通知

如何检测真正的 iOS/APNS 推送令牌何时向 Firebase Cloud Messaging (FCM) 注册?

如何获取所有注册设备(APNS)的设备令牌?

iOS 应用程序可以同时使用基于证书和基于令牌的 APNs 连接吗?