APNS Firebase 通知无法获取令牌
APNS Firebase Notification failed to fetch token
对于 Swift3 / iOS10 看这个 link:
我正在尝试使用 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 - 您是否按照 google 文档中的说明正确配置了您的证书(我不记得这里的过程,它很长...)?
( https://firebase.google.com/docs/cloud-messaging/ios/certs#configure_an_app_id_for_push_notifications )
2 - 我在设置 FCM 时遇到了一些困难。一旦我认为一切正常但通知仍然无法正常工作,我决定从 phone 中完全删除该应用程序,清理我的构建文件夹并重新安装整个东西。在那之后,它正在工作。
3 - 该应用正在接收通知,但我仍然收到 "Failed to fetch default token..." 消息。过了一会儿就消失了。不要问我为什么!
这不是一个正确的答案,我只是分享我的经验,因为我知道配置通知并不容易,欢迎提供任何线索。所以也许这个可以提供帮助。干杯:)
1.Set didFinishLaunchingWithOptions 方法中的通知观察器
2.And 设置 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)
}
我也遇到了同样的问题,但没有任何效果。但是您所要做的就是转到您的 firebase 控制台,然后找到您的项目并转到其设置,在那里检查其云消息选项卡并将您的 .p12 证书上传到其中。
就是这样!编码愉快:)
FCM 正在为我工作,然后就停止了。我按照 Rabs G. 的建议做了,删除了应用程序并重新安装,通知又开始工作了。
在尝试了上述所有方法(以及我在其他地方可以找到的任何方法)之后,解决问题的方法是移动
let token = FIRInstanceID.instanceID().token()
在按下按钮时调用,而不是在应用加载时调用。
我知道这可能不是最优雅的解决方案,但对于调试目的来说已经足够好了。
我猜服务器不能立即使用令牌,需要一些时间才能生成。
上面的答案涵盖了大部分问题,但我遇到了同样的问题,我发现以下信息很有用:
Firebase 可以随时 'rotate'(更改)用户的 FCM 令牌。这是您的服务器将用于向设备发送推送通知的 128 个字符 ID。
Firebase 文档说最佳实践是使用委托通过委托回调方法监视更改:
- (void)messaging:(nonnull FIRMessaging *)messaging didRefreshRegistrationToken:(nonnull NSString *)fcmToken
[对象 - C]
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String)
[Swift]
每次更改都应调用委托方法,此时您可以更新服务器中的记录。
不幸的是,这对我不起作用,我有一个委托,但没有调用回调。所以我不得不在每次应用程序启动时手动更新令牌(正如上面@micheal chein 所建议的那样),如下所示:
NSString *deviceToken = [FIRInstanceID instanceID].token; // Send this to your server
[Obj-C]
let token = FIRInstanceID.instanceID().token() // Send this to your server
[Swift]
** 重要提示:延迟(20-25 秒)后更新令牌,因为旋转有时只能在一段时间后才能反映出来。您可以为此使用计时器。
之后我仍然收到 APNS warning/error 消息:
2017-06-06 09:21:49.520: <FIRInstanceID/WARNING> Failed to fetch APNS token Error Domain=com.firebase.iid Code=1001 "(null)"
但是,推送通知每次都能成功。所以我认为日志消息有点不对劲(可能时间不对)。如果您可以让选项 2 为您工作,那么一定要这样做!
对于 Swift3 / iOS10 看这个 link:
我正在尝试使用 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 - 您是否按照 google 文档中的说明正确配置了您的证书(我不记得这里的过程,它很长...)? ( https://firebase.google.com/docs/cloud-messaging/ios/certs#configure_an_app_id_for_push_notifications )
2 - 我在设置 FCM 时遇到了一些困难。一旦我认为一切正常但通知仍然无法正常工作,我决定从 phone 中完全删除该应用程序,清理我的构建文件夹并重新安装整个东西。在那之后,它正在工作。
3 - 该应用正在接收通知,但我仍然收到 "Failed to fetch default token..." 消息。过了一会儿就消失了。不要问我为什么!
这不是一个正确的答案,我只是分享我的经验,因为我知道配置通知并不容易,欢迎提供任何线索。所以也许这个可以提供帮助。干杯:)
1.Set didFinishLaunchingWithOptions 方法中的通知观察器
2.And 设置 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)
}
我也遇到了同样的问题,但没有任何效果。但是您所要做的就是转到您的 firebase 控制台,然后找到您的项目并转到其设置,在那里检查其云消息选项卡并将您的 .p12 证书上传到其中。
就是这样!编码愉快:)
FCM 正在为我工作,然后就停止了。我按照 Rabs G. 的建议做了,删除了应用程序并重新安装,通知又开始工作了。
在尝试了上述所有方法(以及我在其他地方可以找到的任何方法)之后,解决问题的方法是移动
let token = FIRInstanceID.instanceID().token()
在按下按钮时调用,而不是在应用加载时调用。
我知道这可能不是最优雅的解决方案,但对于调试目的来说已经足够好了。 我猜服务器不能立即使用令牌,需要一些时间才能生成。
上面的答案涵盖了大部分问题,但我遇到了同样的问题,我发现以下信息很有用:
Firebase 可以随时 'rotate'(更改)用户的 FCM 令牌。这是您的服务器将用于向设备发送推送通知的 128 个字符 ID。
Firebase 文档说最佳实践是使用委托通过委托回调方法监视更改:
- (void)messaging:(nonnull FIRMessaging *)messaging didRefreshRegistrationToken:(nonnull NSString *)fcmToken
[对象 - C]
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String)
[Swift]
每次更改都应调用委托方法,此时您可以更新服务器中的记录。
不幸的是,这对我不起作用,我有一个委托,但没有调用回调。所以我不得不在每次应用程序启动时手动更新令牌(正如上面@micheal chein 所建议的那样),如下所示:
NSString *deviceToken = [FIRInstanceID instanceID].token; // Send this to your server
[Obj-C]
let token = FIRInstanceID.instanceID().token() // Send this to your server
[Swift]
** 重要提示:延迟(20-25 秒)后更新令牌,因为旋转有时只能在一段时间后才能反映出来。您可以为此使用计时器。
之后我仍然收到 APNS warning/error 消息:
2017-06-06 09:21:49.520: <FIRInstanceID/WARNING> Failed to fetch APNS token Error Domain=com.firebase.iid Code=1001 "(null)"
但是,推送通知每次都能成功。所以我认为日志消息有点不对劲(可能时间不对)。如果您可以让选项 2 为您工作,那么一定要这样做!