Уведомлению APNS Firebase не удалось получить токен

Для Swift3 / iOS10 смотрите эту ссылку:

ios10, Swift 3 и Firebase Push-уведомления (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)
}
 Caleb_Allen25 авг. 2016 г., 00:52
Любое решение этого?
 Mr.G28 июл. 2016 г., 17:20
ты нашел решение для этого
 Surjeet Rajput22 дек. 2016 г., 08:49
проверить подпись кода indentity.it работал на меня.
 Gruntcakes25 мая 2016 г., 16:15
Реализуйте didFailToRegisterForRemoteNotificationsWithError и посмотрите, вызывается ли он, и если да, то каков код ошибки. Я полагаю, вы включили профиль обеспечения вашего приложения для apns?
 sasquatch21 июн. 2016 г., 17:34
@SausageModulationMatrix Это не попадает в эту функцию
 Uma Madhavi23 дек. 2016 г., 07:13
@commando. Та же проблема, с которой я столкнулся Не удалось получить токен APNS Ошибка Domain = com.firebase.iid Code = 1001 "(null)" & Невозможно соединиться с FCM. Необязательно (Ошибка Domain = com.google.fcm Code = 2001 "(null)"). Пожалуйста, проверьте мой вопросstackoverflow.com/questions/41198651/...

Ответы на вопрос(6)

Ответы выше охватывают большую часть проблемы, но у меня была та же проблема, и я нашел следующую информацию полезной:

Firebase может«Поворот» (изменить) токен FCM пользователя в любое время. Это 128-значный идентификатор, который ваш сервер будет использовать для отправки push-уведомлений на устройство.

Документы Firebase утверждают, что рекомендуется использовать делегата для отслеживания изменений с помощью метода обратного вызова делегата:

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

[Obj - 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:

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

НОПуш-уведомления работают каждый раз в обязательном порядке. Так что я думаю, что сообщение журнала немного отключено (возможно, неправильно). Если вы можете заставить вариант 2 работать на вас, обязательно сделайте это!

 Peza06 июн. 2017 г., 09:49
Вращение токена FCM может произойти после: восстановления приложения на новом устройстве; пользователь удаляет / переустанавливает приложение; пользователь очищает данные приложения.
Решение Вопроса

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

Попробовав все вышеперечисленное (и все, что я смог найти в другом месте), я решил переместить проблему

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

вызываться при нажатии кнопки, а не при загрузке приложения.

Я знаю, что это, вероятно, не самое элегантное решение, но оно достаточно хорошо для целей отладки. Я предполагаю, что токен не сразу доступен для сервера, и на его создание требуется некоторое время.

 michael chein26 янв. 2017 г., 21:17
Вау, спасибо большое! Я вызвал FIRApp.configure () в appDelegate и попытался извлечь токен в viewDidLoad первого контроллера контроллера. мне никогда не приходило в голову, что FIRApp.configure не вызывался. Я переместил свой код (просто обновив токен на мой сервер) в appDelegate, и он отлично работает. :)
 RoyBS24 янв. 2017 г., 12:49
У меня была та же проблема, моя проблема заключалась в том, что я пытался зарегистрироваться для уведомления перед вызовом FIRApp.configure () (без веской причины). когда я изменил, что я получил токен в AppDelegate

FCM работал на меня, потом просто остановился. Я сделал то, что предложил Раб Г., удалил приложение и снова установил его, и уведомления снова начали работать.

 Uma Madhavi20 дек. 2016 г., 10:47
Даже после того, как я проделал это много раз, у меня не получилось.
 Flupp24 нояб. 2016 г., 16:49
Удаление и установка приложения действительно помогли мне

У меня тоже была такая же проблема, и у меня ничего не получалось. Но все, что вам нужно сделать, это зайти в консоль Firebase, а затем найти свой проект и перейти к его настройкам, проверить вкладку облачных сообщений и загрузить туда сертификат .p12.

вот и все! Удачного кодирования :)

 Biranchi30 июл. 2016 г., 12:30
Я уже сделал это, но все еще не работает
 mythicalcoder23 янв. 2017 г., 11:54
Все еще получаю ошибку !! :(
 iAkki27 дек. 2016 г., 08:27
Изначально я добавил только сертификат разработки на консоль Firebase. Даже тогда я получал ошибку. Затем я также добавляю производственный сертификат, который позволяет успешно пройти регистрацию и выдает токен. Итак, согласно моему случаю, нам нужны оба сертификата. добавлено в консоль Firebase.
 mythicalcoder23 янв. 2017 г., 10:54
Я должен был сделать это. Позвольте мне проверить сейчас после загрузки.

1 - Правильно ли вы настроили свои сертификаты, как указано в документации Google (я не буду вспоминать процесс здесь, это довольно долго ...)? (https://firebase.google.com/docs/cloud-messaging/ios/certs#configure_an_app_id_for_push_notifications )

2 - Я столкнулся с некоторыми трудностями при настройке FCM. Как только я подумал, что все в порядке, но уведомления все еще не работали, я решил полностью удалить приложение с телефона, очистить папку сборки и переустановить все это. После этого все заработало.

3 - приложение получало уведомления, но я все еще получал сообщение «Не удалось получить токен по умолчанию ...». Это исчезло через некоторое время. Не спрашивай меня почему!

Это не совсем правильный ответ, я просто делюсь своим опытом, потому что я знаю, что настройка уведомлений не легка, и каждая подсказка приветствуется. Так что, может быть, этот может помочь. Ура :)

 Rabs G07 сент. 2016 г., 13:22
У меня были проблемы с FCM и удалением приложения, а затем очистка и сборка проекта работали для меня.

Ваш ответ на вопрос