Ios 将变量从AppDelegate传递到其他ViewController

Ios 将变量从AppDelegate传递到其他ViewController,ios,swift,Ios,Swift,我的AppDelegate中有这段代码 extension AppDelegate: MessagingDelegate { func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) { print("Firebase registration token: \(fcmToken)")

我的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)
        
    }
    
    
    
}
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访问它。