Уведомление APNS Firebase не удалось получить токен
Для Swift3/iOS10 см. эту ссылку:
ios10, Swift 3 и уведомления о путях Firebase (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
1. Наблюдатель уведомления о наборе данных в didFinishLaunchingWithOptions. Метод
2.Установите метод tokenRefreshNotification, тогда u получите токен в этом методе.
См. ниже Код
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
У меня тоже была такая же проблема, и для меня ничего не работало. Но все, что вам нужно сделать, это перейти на консоль firebase, а затем найти свой проект и перейти к его настройкам, проверить вкладку облачных сообщений и загрузить в него свой сертификат .p12.
вот оно! счастливое кодирование:)
Ответ 3
1 - Вы правильно настроили свои сертификаты, как указано в документации Google (я не буду вспоминать процесс здесь, это довольно долго...)?
(https://firebase.google.com/docs/cloud-messaging/ios/certs#configure_an_app_id_for_push_notifications)
2 - У меня возникли трудности при настройке FCM. Как только я подумал, что все в порядке, но уведомления все еще не работают, я решил полностью удалить приложение с телефона, очистить папку сборки и переустановить все. После этого он работал.
3 - Приложение получало уведомления, но я все еще получал сообщение "Failed to fetch default token...". Через некоторое время оно исчезло. Не спрашивайте меня, почему!
На самом деле это не правильный ответ, я просто передаю свой опыт, потому что знаю, что настройка уведомления непростая, и каждый ключ приветствуется. Так может быть, это может помочь. Приветствия:)
Ответ 4
Попробовав все вышеперечисленное (и все, что я могу найти в другом месте), для меня проблема заключается в перемещении
let token = FIRInstanceID.instanceID().token()
для вызова при нажатии кнопки, а не при загрузке приложения.
Я знаю, это, вероятно, не самое изящное решение, но оно достаточно хорошо для целей отладки.
Я предполагаю, что токен недоступен немедленно сервером и требует некоторого времени для создания.
Ответ 5
Ответы, приведенные выше, охватывают большую часть проблемы, но у меня была та же проблема, и я нашел следующую информацию полезной:
-
Firebase может "повернуть" (изменить) токен пользователя FCM в любое время. Это 128-символьный идентификатор, который ваш сервер будет использовать для отправки push-уведомления на устройство.
-
Firebase docs говорят, что наилучшей практикой является использование делегата для мониторинга изменений с помощью метода обратного вызова делегата:
- (void)messaging:(nonnull FIRMessaging *)messaging didRefreshRegistrationToken:(nonnull NSString *)fcmToken
[Obj - C]
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String)
[Свифт]
Метод делегата должен быть вызван при каждом изменении, после чего вы можете обновить запись на своем сервере.
-
К сожалению, это не работало для меня, у меня был делегат, но обратный вызов не вызывался. Поэтому мне приходилось прибегать к ручному обновлению токена при каждом запуске приложения (как было предложено @micheal chein выше) следующим образом:
NSString *deviceToken = [FIRInstanceID instanceID].token; // Send this to your server
[Obj-С]
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)"
НО, push-уведомления работают каждый раз в обязательном порядке. Поэтому я думаю, что сообщение в журнале немного выключено (возможно, оно ошибочно). Если вы можете получить вариант 2, чтобы работать на вас, определенно сделайте это!
Ответ 6
FCM работал на меня, а затем просто остановился. Я сделал то, что предложил Rabs G., и удалил приложение и установил его снова, и уведомления снова начали работать.