APNS Firebase通知无法获取令牌

时间:2016-05-25 13:15:23

标签: ios swift push-notification firebase firebase-notifications

对于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)
}

6 个答案:

答案 0 :(得分:22)

我也有同样的问题,没有什么对我有用。但是你所要做的就是去你的firebase控制台然后找到你的项目并转到它的设置,检查它的云消息选项卡并将你的.p12证书上传到它。

那就是它!快乐的编码:)

答案 1 :(得分:13)

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)
}

答案 2 :(得分:4)

1 - 您是否正确配置了Google文档中指定的证书(我在这里不记得这个过程,这很长......)? (https://firebase.google.com/docs/cloud-messaging/ios/certs#configure_an_app_id_for_push_notifications

2 - 我在设置FCM时遇到了一些困难。一旦我认为一切正常但通知仍然无效,我已经决定从手机中完全删除应用程序,清理我的构建文件夹并重新安装整个程序。在那之后,它正在发挥作用。

3 - 应用程序正在接收通知,但我仍然收到&#34;无法获取默认令牌...&#34;信息。一段时间后它消失了。不要问我为什么!

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

答案 3 :(得分:3)

在尝试了以上所有内容(以及我在其他地方可以找到的任何内容)后,解决问题的方法是移动

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

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

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

答案 4 :(得分:2)

FCM正在为我工​​作然后就停了下来。我做了Rabs G.的建议并删除了应用并重新安装,通知再次开始工作。

答案 5 :(得分:2)

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

  1. Firebase可以随时&#39; (更改)用户的FCM令牌。这是服务器用于将推送通知发送到设备的128个字符ID。

  2. Firebase文档说最佳做法是使用委托来监控委托回调方法的更改:

    - (void)messaging:(nonnull FIRMessaging *)messaging didRefreshRegistrationToken:(nonnull NSString *)fcmToken
    
  3. [Obj - C]

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

    [夫特]

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

    1. 不幸的是,我没有为我工作,我有一个代表,但回调没有被调用。所以我不得不在每个应用程序启动时手动更新令牌(如上面的@micheal chein所示),如下所示:

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

      [对象 - C]

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

      [夫特]

    2. **重要提示:延迟(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)"
        
      2. ,每次推送通知都能正常工作。所以我认为日志消息有点过时(可能是不合时宜的)。如果你可以选择2为你工作,那肯定是这样的!