首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >KeychainItemWrapper还回NSZeroData?

KeychainItemWrapper还回NSZeroData?
EN

Stack Overflow用户
提问于 2014-04-18 09:53:05
回答 1查看 1.5K关注 0票数 3

我使用苹果的KeychainItemWrapper将密码存储在密钥链上。在某种程度上,如果我试图获取尚未安装的密码,请使用

代码语言:javascript
运行
复制
  KeychainItemWrapper* keychain = [[KeychainItemWrapper alloc] initWithIdentifier:identifier accessGroup:nil];
  NSString *password = [keychain objectForKey:kSecValueData];

密码在调试器上带有此标识返回。

代码语言:javascript
运行
复制
password = (_NSZeroData *) class name = _NSZeroData

如果我让代码继续使用这个值,它就会崩溃。

这个值不是零。如果我用if (!password)测试它会失败..。并且不是字符串空值(如果我尝试将其测试为NSString,它就会崩溃)。

在继续之前,我如何测试这个东西,看看它是否有效?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-18 16:29:08

我发现了这个问题,顺便说一句,我非常讨厌苹果公司写的那些糟糕的文件。

这就是问题所在。尽管文档建议您应该使用kSecValueData像普通字符串一样存储密码

代码语言:javascript
运行
复制
  NSString *myPassword = @"12345";
  KeychainItemWrapper* keychain = [[KeychainItemWrapper alloc] initWithIdentifier:identifier accessGroup:nil];
  [keychain setObject:myPassword forKey:(__bridge id)kSecValueData];

你不该那么做。事实上,顾名思义和文档应该说的那样,kSecValueData需要一个NSData对象。因此,在存储NSString之前,必须将它转换为NSData,如下所示:

代码语言:javascript
运行
复制
  NSString *myPassword = @"12345";
  KeychainItemWrapper* keychain = [[KeychainItemWrapper alloc] initWithIdentifier:identifier accessGroup:nil];
  NSData *myPasswordData = [myPassword dataUsingEncoding:NSUTF8StringEncoding];
  [keychain setObject:myPasswordData forKey:(__bridge id)kSecValueData];

当将其返回时,必须将其转换为NSData并将其转换回NSString

代码语言:javascript
运行
复制
  NSData *myPasswordData = (NSData *)[keychain objectForKey:(__bridge id)kSecValueData];

  NSString *myPassword = [[NSString alloc] initWithData: myPasswordData
                                           encoding:NSUTF8StringEncoding];
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23151645

复制
相关文章

相似问题

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