2017-07-24 84 views
0

我正在开发使用JWT身份验证的应用程序。服务器端在expiry date之后没有提供自动更新令牌的机制,但我已经提供了一个用于刷新令牌的特殊方法。其实我不知道如何正确检查expiry date。我想为expiry date设置Timer,但是当应用程序在后台时定时器不工作。我还想过在viewWillAppear中检查令牌有效性,但是通过这样做,服务器请求的数量急剧增加,这也不够好。在ios上刷新JWT身份验证令牌

任何帮助,将不胜感激

+0

你找到了正确的方法吗? – user805981

回答

1

首先,你应该建立在你的AppDelegate的方法来处理你的令牌获取。然后做这样的事情

func getToken() { 
    //Whatever you need to do here. 
    UserDefaults.standard.set(Date(), forKey: "tokenAcquisitionTime") 
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "tokenAcquired"), object: nil) 
} 

AppDelegate

var timer: Timer! 

创建一个定时器变量创建您AppDelegate

func postTokenAcquisitionScript() { 
    timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(tick), userInfo: nil, repeats: true) 
} 

func tick() { 
    if let time = UserDefaults.standard.value(forKey: "tokenAcquisitionTime") as? Date { 
     if Date().timeIntervalSince(time) > 3600 { //You can change '3600' to your desired value. Keep in mind that this value is in seconds. So in this case, it is checking for an hour 
      timer.invalidate() 
      getToken() 
     } 
    } 
} 

最后下面的方法,在你的AppDelegatedidFinishLaunchingwillEnterForegrounddidEnterBackground,请执行以下操作

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    //Your code here 
    NotificationCenter.default.addObserver(self, selector: #selector(postTokenAcquisitionScript), name: NSNotification.Name(rawValue: "tokenAcquired"), object: nil) 
} 

func applicationWillEnterForeground(_ application: UIApplication) { 
    //Your code here 
    NotificationCenter.default.addObserver(self, selector: #selector(postTokenAcquisitionScript), name: NSNotification.Name(rawValue: "tokenAcquired"), object: nil) 
} 

func applicationDidEnterBackground(_ application: UIApplication) { 
    //Your code here 
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name(rawValue: "tokenAcquired"), object: nil) 
}