首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS KeychainItemWrapper未更新

iOS KeychainItemWrapper未更新
EN

Stack Overflow用户
提问于 2011-11-09 01:06:53
回答 2查看 12.1K关注 0票数 11

我刚刚发现我的应用程序有一个有趣的问题。在应用程序中,我将用户的用户名和密码保存到密钥链中。

代码语言:javascript
运行
复制
keychainWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyLoginPassword" accessGroup:nil];

[keychainWrapper setObject:usernameField.text forKey:(id)kSecAttrAccount];
[keychainWrapper setObject:passwordField.text forKey:(id)kSecValueData];

当这段代码在Debug中运行时,它似乎工作得很好。它每次都会更新,稍后我可以从密钥链中检索这些项。但是,当它在分发中运行时,密钥链永远不会更新。我已经验证了,是的,这些代码行在两个构建中都被命中了。我正在使用Xcode4.2和iOS5软件开发工具包,并在安装了iOS5的iPad 2上运行该应用程序。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-23 17:19:03

我也有这个问题,我花了很长时间才弄明白

有一个版本的"KeychainWrapper“在NSAssert中有它的SecItemUpdate (以及其他东西)。

不管是谁做的,都是个笨蛋!在为发布/发布而构建时,每个NSAssert都是无效的,这意味着代码甚至不会运行。

例如:

代码语言:javascript
运行
复制
NSAssert(SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)tempCheck), @"Couldn't update the Keychain Item." );

需要成为

代码语言:javascript
运行
复制
OSStatus status = SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)tempCheck);
NSAssert(status == noErr, @"Couldn't update the Keychain Item." );

请注意如何将实际的SecItemUpdate移到NSAssert之外,并检查结果

重要提示:尝试更新kSecValueData的值,而不指定kSecAttrAccount的值,也会导致断言失败。因此,如果您打算存储单个敏感数据字符串(如信用卡号列表),请确保在kSecAttrAccount属性中存储一些"account name“文本,如下所示:

代码语言:javascript
运行
复制
static NSString* kCardListXML = @"cardListXML";
static NSString* cardListAccountName = @"cardListAccount";

-(void)setCardListXML:(NSString*)xml {
  KeychainItemWrapper* wrapper =
    [[KeychainItemWrapper alloc] initWithIdentifier:kCardListXML accessGroup:nil];
  [wrapper setObject:cardListAccountName forKey:(id)CFBridgingRelease(kSecAttrAccount)];
  [wrapper setObject:xml forKey:(id)CFBridgingRelease(kSecValueData)];
}    

-(NSString*)getCardListXML {
  KeychainItemWrapper* wrapper =
    [[KeychainItemWrapper alloc] initWithIdentifier:kCardListXML accessGroup:nil];
  [wrapper setObject:cardListAccountName forKey:(id)CFBridgingRelease(kSecAttrAccount)];
  return [wrapper objectForKey:CFBridgingRelease(kSecValueData)];
}
票数 17
EN

Stack Overflow用户

发布于 2011-12-07 16:53:53

当您包含

代码语言:javascript
运行
复制
keychainWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyLoginPassword" accessGroup:nil];

[keychainWrapper setObject:usernameField.text forKey:(id)kSecAttrAccount];
[keychainWrapper setObject:passwordField.text forKey:(id)kSecValueData];

,你还必须包括

代码语言:javascript
运行
复制
[keychainWrapper setObject:@"Myappstring" forKey: (id)kSecAttrService];

否则我会得到一个"SIGABRT“错误。(Myappstring)是定义应用程序的字符串。

也许我漏掉了什么,这至少应该做一次。

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

https://stackoverflow.com/questions/8054285

复制
相关文章

相似问题

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