Ios 将变量从AppDelegate传递到其他ViewController
我的AppDelegate中有这段代码Ios 将变量从AppDelegate传递到其他ViewController,ios,swift,Ios,Swift,我的AppDelegate中有这段代码 extension AppDelegate: MessagingDelegate { func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) { print("Firebase registration token: \(fcmToken)")
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)
}
}
var fcmToken:String?
如您所见,我在AppDelegate中时可以访问fcmToken
变量。
我可以确认它正在工作,因为我看到令牌在控制台中打印出来
现在
我想稍后在LoginVC上的代码中访问此变量
print(fcmToken)
c1DdtdDF1Rs:APA91BGJBUD65NIDQIFDO90AVNGQ0WIMJUAZZXVJ8C_tYmFe5dkmgweOdO10jzPRlMVZF_qNyWMMsu7EhA5IMVo3jLWvBThDteR7WWUPqau-ZFAHKQPWGI5VB48VA-_4nwkZCKrOVoT
注意:只有在用户登录成功后,即我需要在Firebase数据库中创建记录时,才在LoginVC中登录成功。为了创建该记录,我需要AppDelegate的fcmToken
最干净的方法是什么?您可以在AppDelegate中创建一个var
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)
}
}
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("retrieved \(refreshedToken)")
fcmToken = refreshedToken
}
else{
print("not retrieved yet")
}
}
@objc func tokenRefreshNotification(_ notification: Notification) {
if let refreshedToken = FIRInstanceID.instanceID().token() {
print("retrieved \(refreshedToken)")
fcmToken = refreshedToken
}
}
有时firebase会出现故障并延迟发送令牌,因此建议您在每次启动应用程序时将令牌发送到服务器,以便在您可以在AppDelegate内创建var之前跟踪刷新和零上传令牌的可能性
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)
}
}
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("retrieved \(refreshedToken)")
fcmToken = refreshedToken
}
else{
print("not retrieved yet")
}
}
@objc func tokenRefreshNotification(_ notification: Notification) {
if let refreshedToken = FIRInstanceID.instanceID().token() {
print("retrieved \(refreshedToken)")
fcmToken = refreshedToken
}
}
有时firebase会出现故障并延迟发送令牌,因此建议您在每次启动应用程序时将令牌发送到服务器,以便在
UIApplication
的shared
实例的AppDelegate
之前跟踪刷新和零上传令牌的可能性
let delegate = UIApplication.shared.delegate as! AppDelegate
然后可以从委托访问变量
delegate.fcmToken
您必须获得
ui应用程序的shared
实例的AppDelegate
引用
let delegate = UIApplication.shared.delegate as! AppDelegate
然后可以从委托访问变量
delegate.fcmToken
首先在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 as!AppDelegate)
在你的vc中:
let appDelegate = UIApplication.shared.delegate as! AppDelegate
然后你可以使用这个:
appDelegate.myToken
首先在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 as!AppDelegate)
在你的vc中:
let appDelegate = UIApplication.shared.delegate as! AppDelegate
然后你可以使用这个:
appDelegate.myToken
无需强制展开
func appDelegate() -> AppDelegate? {
let appDelegate = UIApplication.shared.delegate as? AppDelegate
return appDelegate
}
从appDelegate()
实例访问fcmToken
变量
appDelegate().fcmToken
无需强制展开
func appDelegate() -> AppDelegate? {
let appDelegate = UIApplication.shared.delegate as? AppDelegate
return appDelegate
}
从appDelegate()
实例访问fcmToken
变量
appDelegate().fcmToken
为什么不能在视图控制器中为该通知添加一个观察者?为什么不能在视图控制器中为该通知添加一个观察者?如果成功,我们应该在if-let块中添加什么?如果失败呢?我们应该添加elese吗?我知道这是一个失败的问题,但是让我给你一个解决方法,我们应该在if-let块中添加什么来获得成功?如果失败了呢?我们应该添加elese吗?我知道这是一个失败的问题,但让我给你解决方法更新你的答案包括如何从其他VC访问它。更新你的答案包括如何从其他VC访问它。