Правильный способ получения токена для FCM - iOS 10 Swift 3

Я реализовал Firebase с FirebaseAuth/FCM и т.д. и успешно отправил уведомление через Firebase Console.

Однако мне нужно будет отправить уведомление с моего собственного сервера приложений.

Мне интересно, какой путь является правильным способом получить идентификатор регистрации для устройства: -

1) получить регистрационный идентификатор регистрации из didRegisterForRemoteNotificationWithDeviceToken

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    var token = ""

    for i in 0..<deviceToken.count {
        token += String(format: "%02.2hhx", arguments: [deviceToken[i]])
    }

    print("Registration succeeded!")
    print("Token: ", token)
    Callquery(token)

}

2) Получить регистрационный токен из firebase (на основе документа Firebase, который извлекает текущий токен регистрации)

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

i использовал первый способ, push-уведомление не принимается, даже если идентификатор регистрации хранится в базе данных моего сервера приложений, и я получаю этот результат сеанса CURL: -

{"multicast_id":6074293608087656831,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}

Я также попробовал второй способ и получил фатальную ошибку при запуске приложения, как показано ниже: введите описание изображения здесь

оценил, может ли кто-нибудь указать мне правильный путь, спасибо!

Ответ 1

Функция tokenRefreshNotification не всегда вызывается при запуске приложения.

Однако при размещении кода внутри регулярной функции делегата didRegisterForRemoteNotificationsWithDeviceToken я могу получить токен каждый раз:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    if let refreshedToken = FIRInstanceID.instanceID().token() {
        print("InstanceID token: \(refreshedToken)")
    }
}

(скорость 3)

Ответ 2

Swift 3 + Firebase 4.0.4:

static var FirebaseToken : String? {
    return InstanceID.instanceID().token()
}

Ответ 4

Перейдите со вторым параметром, и это будет казаться действительно глупым/простым, но чтобы исправить эту необязательную фатальную ошибку nil, просто удалите разворот в конце

Ваш код:
var token = FIRInstanceID.instanceID().token()!
Сделать это:
var token = FIRInstanceID.instanceID().token()

Это по крайней мере устранит этот неприятный сбой

Ответ 5

Значок устройства FCM swift3

    let fcmDeviceToken = FIRInstanceID.instanceID().token()
    print("FCM token: \(fcmDeviceToken ?? "")")

Ответ 6

Первый регистр для уведомления об обновлении токена firebase:

NotificationCenter.default.addObserver(self, selector: 
     #selector(tokenRefreshNotification), name:     
     NSNotification.Name.InstanceIDTokenRefresh, object: nil)

Затем вы можете получить токен в селекторе tokenRefreshNotification:

func tokenRefreshNotification(_ notification: Notification) {
    if let refreshedToken = FIRInstanceID.instanceID().token() {
      print("InstanceID token: \(refreshedToken)")
    }

    // Connect to FCM since connection may have failed when attempted before having a token.
    connectToFcm()
}

Ответ 7

попробуйте это

let credential = FIRFacebookAuthProvider.credential(withAccessToken;FBSDKAccessToken.current().tokenString)