我的AppDelegate中有这段代码
extension AppDelegate: MessagingDelegate {
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
print("Firebase registration token: \(fcmToken)")
fcmTokenString = fcmToken
let dataDict:[String: String] = ["token": fcmToken]
NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
}
}
如您所见,当我处于AppDelegate时,我可以访问fcmToken
变量。
我可以确认它正在工作,因为我看到控制台中已打印出令牌。
我想稍后在我的LoginVC上的代码上访问此变量。
print(fcmToken)
c1DdtdDF1Rs:APA91bGJBUD65nidQiFDO90AVNgq0wiMjUaZmZXVJ8c_tYmFe5dkmgweOdO10jzPRlMVZF_qNyWMMsu7EhA5IMVo3jLWvBThDZR-ZKFFA_KWFA_QWF_CFA_QWFA_QW
注意: 仅在LoginVC内的用户登录成功后,才需要在Firebase数据库中创建记录。为了创建该记录,我需要来自AppDelegate的fcmToken。
最干净的方法是什么?
答案 0 :(得分:2)
您可以在AppDelegate中创建一个var
var fcmToken:String?
在回调中分配它,然后在任何vc中使用它
let de = UIApplication.shared.delegate as! AppDelegate
if let token = de.fcmToken {
}
您当前解决方案的问题是,在显示vc之前可能会发布通知(这意味着它在注册为观察者之前会丢失令牌)
您可以通过
观察变化 var tokenTimer:Timer! // why timer ? as sometimes token changed and firInstanceIDTokenRefresh not fired also you can get rid of firInstanceIDTokenRefresh implementation
// put these inside AppDelegate didFinishLaunching...
NotificationCenter.default.addObserver(self,
selector: #selector(self.tokenRefreshNotification),
name: .firInstanceIDTokenRefresh,
object: nil)
self.tokenTimer = Timer.scheduledTimer(timeInterval:0.3,
target: self,
selector: #selector(self.checkToken),
userInfo: nil,
repeats: true)
@objc func checkToken()
{
if let refreshedToken = FIRInstanceID.instanceID().token() {
print("retireved \(refreshedToken)")
fcmToken = refreshedToken
}
else{
print("not retireved yet")
}
}
@objc func tokenRefreshNotification(_ notification: Notification) {
if let refreshedToken = FIRInstanceID.instanceID().token() {
print("retireved \(refreshedToken)")
fcmToken = refreshedToken
}
}
有时Firebase会出现故障并延迟发送令牌,因此,这是建议在每次启动应用程序时将令牌发送到服务器的方法,以跟踪刷新和之前没有上载令牌的可能性
答案 1 :(得分:1)
您必须引用AppDelegate
的{{1}}实例的shared
。
UIApplication
然后您可以从委托访问变量
let delegate = UIApplication.shared.delegate as! AppDelegate
答案 2 :(得分:1)
首先在您的AppDelegate类中定义一个变量:
class AppDelegate {
var myToken: String?
// code in your app delegate
}
将此行添加到您的函数中:
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
print("Firebase registration token: \(fcmToken)")
fcmTokenString = fcmToken
self.myToken = fcmToken
let dataDict:[String: String] = ["token": fcmToken]
NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)
}
然后您可以访问“ myToken”变量,将您的AppDelegate引用(UIApplication.shared.delegate用作!Appdelegate)
在您的vc中:
let appDelegate = UIApplication.shared.delegate as! AppDelegate
然后您可以使用此:
appDelegate.myToken
答案 3 :(得分:0)
没有强制展开,
func appDelegate() -> AppDelegate? {
let appDelegate = UIApplication.shared.delegate as? AppDelegate
return appDelegate
}
从fcmToken
实例访问appDelegate()
变量
appDelegate().fcmToken