我正在尝试将设备 token 保存到 NSUserDefaults
,但我无法做到这一点。
我的代码:
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
var currentToken=preferences.stringForKey(pushTokenKey)
if currentToken != deviceToken {
var dataString = NSString(data: deviceToken, encoding:NSUTF8StringEncoding) as String?
self.preferences.setValue(dataString, forKey: pushTokenKey)
self.preferences.synchronize()
}
}
您可以看到我正在比较 token ,如果它们不相同,我正在更新它。但我猜它总是保存为nil
,因为deviceToken
是NSData
。
如何解决这个问题?
最佳答案
设备 token 不应保存到任何地方。只需将其保存在内存中的某个全局变量中即可。当您重新打开应用程序时,您将再次从 APNS-API 获得相同的 token 。您的委托(delegate)方法将再次被调用,并且不会再次询问用户过去是否已经同意向您提供 token 。文档明确指出您不应该保存它!
您的方法的工作方式,您也可以在任何情况下保存 token ,无论它是否更改,并且它会执行完全相同的操作,因为模式就是这样的
if(a != b) {
b = a;
}
相当于只是
b = a;
此外,设备 token 是二进制数据,因此它不是 UTF-8 编码的(您尝试将其转换为字符串,将二进制数据解释为 NSUTF8StringEncoding
)。在 99% 的情况下,不可能将其编码为 UTF-8,因此您将得到 nil。
此外,即使 token 是 UTF-8(在 10^16 种情况中只有一种),比较仍然会说它们不相等,因为您正在将 NSData 二进制文件与 NSString 进行比较.
关于ios - 将 deviceToken 保存到 NSUserDefaults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30174660/