将变量从AppDelegate传递给其他ViewController

时间:2018-12-06 20:00:19

标签: ios swift

我的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变量。 我可以确认它正在工作,因为我看到控制台中已打印出令牌。

enter image description here

现在

我想稍后在我的LoginVC上的代码上访问此变量。

print(fcmToken)
  

c1DdtdDF1Rs:APA91bGJBUD65nidQiFDO90AVNgq0wiMjUaZmZXVJ8c_tYmFe5dkmgweOdO10jzPRlMVZF_qNyWMMsu7EhA5IMVo3jLWvBThDZR-ZKFFA_KWFA_QWF_CFA_QWFA_QW

注意: 仅在LoginVC内的用户登录成功后,才需要在Firebase数据库中创建记录。为了创建该记录,我需要来自AppDelegate的fcmToken。

最干净的方法是什么?

4 个答案:

答案 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