Подтвердить что ты не робот

Уведомление 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)
}
4b9b3361

Ответ 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)

[Свифт]

Метод делегата должен быть вызван при каждом изменении, после чего вы можете обновить запись на своем сервере.

  1. К сожалению, это не работало для меня, у меня был делегат, но обратный вызов не вызывался. Поэтому мне приходилось прибегать к ручному обновлению токена при каждом запуске приложения (как было предложено @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 секунд), так как поворот может иногда отражаться только через некоторое время. Вы можете использовать для этого таймер.

  1. После этого я все еще получаю сообщение предупреждения/ошибки 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., и удалил приложение и установил его снова, и уведомления снова начали работать.