ios - 将 deviceToken 保存到 NSUserDefaults

标签 ios swift

我正在尝试将设备 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,因为deviceTokenNSData

如何解决这个问题?

最佳答案

设备 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/

相关文章:

ios - 带有核心文本的自定义 UITableViewCell

ios - tableView delete动画仅在从底部删除时有效

ios - SwiftUI 如何实现暗模式切换并刷新所有 View

ios - Titanium 不使用新行更新 TableViewSection

ios - 更新配置文件

ios - 将数据从 ViewController 传递到 TabBarController

swift - 基本的 spritebuilder 和 swift

ios - 如何在 ios 中将 NSString 转换为 Float64?并从 TextField 中检索文本

ios - 使用自定义 URL 方案启动的应用程序。完成后如何将数据返回给调用应用程序?

ios - Swift 2.0 子类化 UIViewController 的子类并调用便利初始化器