首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将deviceToken保存到NSUserDefaults

将deviceToken保存到NSUserDefaults
EN

Stack Overflow用户
提问于 2015-05-11 18:08:05
回答 2查看 2K关注 0票数 2

我试图将设备令牌保存到NSUserDefaults,但我做不到。

我的代码:

代码语言:javascript
复制
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()
    }
}

您可以看到,我正在比较令牌,如果它们不相同,我将更新它。但它总是以nil的形式保存,我猜是因为deviceTokenNSData

我如何解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-11 18:14:39

你为什么得到零是因为它不能把那个NSData变成NSString

通过使用deviceToken.description,您将获得字符串令牌。

代码语言:javascript
复制
var currentToken=preferences.stringForKey(pushTokenKey)

if currentToken != deviceToken.description { // Here you were comparing  String and NSData ?? :S
    var dataString = deviceToken.description
    self.preferences.setValue(dataString, forKey: pushTokenKey)
    self.preferences.synchronize()
}
票数 0
EN

Stack Overflow用户

发布于 2015-05-11 18:29:11

设备令牌不应保存到任何地方。只需将其保存在内存中某个全局变量中即可。当您重新打开应用程序时,您将再次从APNS获得相同的令牌。您的委托方法将再次被调用,并且不会再次询问用户是否已经同意在过去给您令牌。文档解释说,您不应该保存它!

您的方法的工作方式,您也可以保存令牌在任何情况下,无论它是否改变,它将完全一样,因为模式是

代码语言:javascript
复制
if(a != b) {
    b = a;
}

就等于

代码语言:javascript
复制
b = a;

此外,设备令牌是二进制数据,所以它不是UTF-8编码的(您试图将其转换为字符串,将二进制数据解释为NSUTF8StringEncoding)。在99%的情况下,不可能将其编码为UTF-8,因此您将获得零。

此外,即使令牌是UTF-8 (在10^16种情况中有1种),比较仍然会说它们是不相等的,因为您正在比较NSData二进制和NSString。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30174660

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档