【问题标题】:Change/update Firebase notification token or instance id forcefully via code?通过代码强制更改/更新 Firebase 通知令牌或实例 ID?
【发布时间】:2017-03-11 22:51:07
【问题描述】:

我应该怎么做才能更改或请求 firebase 中的令牌? firebase 根据设备信息生成的唯一令牌。

【问题讨论】:

  • 很抱歉您不喜欢我对您问题的编辑。但是请注意,device-instance-id 标签是关于 Windows 设备实例 ID 的,它与 Firebase InstanceID 无关。我可以建议您使用instanceid 标签吗?请注意,截至目前,只有 2 个问题以错误的方式使用了 device-instance-id 标签,这就是其中之一。

标签: ios swift firebase firebase-cloud-messaging device-instance-id


【解决方案1】:

在为推送通知生成新的或更改 firebase 令牌时遇到许多麻烦后,现在我得到了答案。

1) 删除旧的 Firebase 令牌

let instance = FIRInstanceID.instanceID()
_ = FIRInstanceID.delete(instance)
FIRInstanceID.instanceID().delete { (err:Error?) in
    if err != nil{
        print(err.debugDescription);
    } else {
        print("Token Deleted");
    }
}

2) 请求新的 Firebase 令牌

if let token = FIRInstanceID.instanceID().token() {
    print("Token \(token) fetched");
} else {
    print("Unable to fetch token");
}

FIRMessaging.messaging().connect { (error) in
    if (error != nil) {
        print("Error connecting to FCM. \(error.debugDescription)")
    } else {
        print("Connected to FCM.")
    }
}

SWIFT 4 和 Firebase 4.8.2 更新(按照简单的两个步骤)??

1) 删除旧令牌

let instance = InstanceID.instanceID()
instance.deleteID { (error) in
    print(error.debugDescription)
}

2) 请求新令牌

if let token = InstanceID.instanceID().token() {
    print("Token : \(token)");
} else {
    print(“Error: unable to fetch token");
}

Messaging.messaging().shouldEstablishDirectChannel = true

您可以在 MessagingDelegate 方法 didReceiveRegistrationToken 和 Refresh Token 中获取更新的令牌。

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
    print("Firebase Token :  \(fcmToken)")
}

【讨论】:

  • 更新令牌需要这个“messaging().connect”?
  • 是的,因为无法更新令牌,首先我们必须删除令牌,然后请求新令牌,因此需要“messaging().connect”。如果您能找到其他方法,欢迎随时提出建议。
  • 这个“delete”不再使用了,我们必须使用“shouldEstablishDirectChannel”布尔值,并且不刷新token,保持不变。当我解决它时,我会放在这里。谢谢!
  • 对于 Swift 3:让 instance = InstanceID.instanceID() instance.deleteID { (error) in print(error.debugDescription) }
  • 如何使用常规目标 C 和较旧的 firebase SDK 完成此操作?
【解决方案2】:

目前InstanceID.instanceID().token() 已被弃用。

你应该使用这个:

let instance = InstanceID.instanceID()
instance.deleteID { (error) in
  print(error.debugDescription)
}

instance.instanceID { (result, error) in
  if let error = error {
    print("Error fetching remote instange ID: \(error)")
  } else {
    print("Remote instance ID token: \(String(describing: result?.token))")
  }
}
Messaging.messaging().shouldEstablishDirectChannel = true

然后在 AppDelegate 中:

extension AppDelegate: MessagingDelegate {

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
    //Here is your new FCM token
    print("Registered with FCM with token:", fcmToken)
}

【讨论】:

  • 在“instance.instanceID”结果中?.token 返回旧令牌。因此无需调用此方法。
【解决方案3】:

针对 FIREBASE 消息传递 7.3.0 进行了更新

class func regenerateFCM(){
    Installations.installations().delete { (err) in
        if let err = err {
            print(err)
        }else{
            Installations.installations().authTokenForcingRefresh(true) { (result,err) in
                if let result = result {
                    print(result)
                   
                    Messaging.messaging().deleteToken { (err) in
                        if let err = err {
                            print(err)
                        }else{
                            print("FCM TOKEN DELETED")
                            Messaging.messaging().token { (token, err) in
                                if let token = token {
                                    print("NEW FCM TOKEN GENERATED")
                                    print(token)
                                }
                                if let err = err {
                                    print("ERROR WHILE GENERATING NEW FCM TOKEN")
                                    print(err)
                                }
                            }
                        }
                    }
                    
                }else if let err = err {
                    print(err)
                }
            }
        }
    }
}

FIREBASE 8.5.0 更新

Messaging.messaging().deleteToken { err in
        if let err = err {
            print("Error while generating new FCM Token")
            print(err)
        }else{
            Messaging.messaging().token { token, err in
                 if let token = token {
                    print("NEW FCM TOKEN GENERATED")
                    print(token)
                }
            }
        }
    }

【讨论】:

  • 你让它工作了吗? @Shahzaib 我得到了新令牌,但它们不适用于 FCM。只有初始令牌有效
【解决方案4】:

Swift 4、FireBase 4.8.2、FirebaseMessaging (2.0.8) 的更新答案

debugPrint("Existing Token :- \(Messaging.messaging().fcmToken!)")

let instance = InstanceID.instanceID()
instance.deleteID { (error) in
    print(error.debugDescription)
}

if let token = InstanceID.instanceID().token() {
    print("Token \(token) fetched");
} else {
    print("Unable to fetch token");
}
Messaging.messaging().shouldEstablishDirectChannel = true

我们在 MessagingDelegate 方法和 Refresh Token 中收到这个更新的令牌

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
    print("Firebase registration token: \(fcmToken)")
}

【讨论】:

    【解决方案5】:

    我了解到您想要更改或更新 firebase 令牌。

    创建以下两个方法

    func registerFirebaseToken() {
        if let token = InstanceID.instanceID().token() {
            print("FIREBASE: Token \(token) fetched")
        } else {
            print("FIREBASE: Unable to fetch token");
        }
    
        Messaging.messaging().shouldEstablishDirectChannel = true
    }
    
    func unregisterFirebaseToken(completion: @escaping (Bool)->()) {
        // Delete the Firebase instance ID
        InstanceID.instanceID().deleteID { (error) in
            if error != nil{
                print("FIREBASE: ", error.debugDescription);
                completion(false)
            } else {
                print("FIREBASE: Token Deleted");
                completion(true)
            }
        }
    }
    

    调用

    注销FirebaseToken(:)

    并在闭包中检查是否为真然后调用

    registerFirebaseToken()

    这将是第一次失败,其中一个委托方法将被调用,即

    extension AppDelegate: MessagingDelegate {
        func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
            registerFirebaseToken()
        }
    }
    

    这次

    registerFirebaseToken()

    将从委托方法中再次调用,您将获得一个新令牌。

    【讨论】:

    • 它只在第一次工作,然后不会收到来自 firebase 控制台和应用程序的通知。允许权限并刷新令牌并尝试使用刷新令牌。没有推送通知的任何想法?
    猜你喜欢
    • 1970-01-01
    • 2017-02-22
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    相关资源
    最近更新 更多