iOS KeychainItemWrapper未更新

iHo*_*rse 11 keychain ios ios5

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

keychainWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyLoginPassword" accessGroup:nil];

[keychainWrapper setObject:usernameField.text forKey:(id)kSecAttrAccount];
[keychainWrapper setObject:passwordField.text forKey:(id)kSecValueData];
Run Code Online (Sandbox Code Playgroud)

当这个代码在Debug中运行时,似乎工作正常.它每次都会更新,之后我可以从钥匙串中检索这些项目.当它在Distribution中运行时,钥匙串永远不会更新.我已经验证了这两行代码都会遇到这些代码行.我正在使用Xcode 4.2和iOS5 SDK,并在安装了iOS5的iPad 2上运行应用程序.

Som*_*Guy 17

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

有一个版本的"KeychainWrapper"漂浮在NSAssert(以及其他东西)中的SecItemUpdate.

无论谁做了这个都是白痴!当构建发布/分发时,每个NSAssert都无效,这意味着代码甚至无法运行.

例如:

NSAssert(SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)tempCheck), @"Couldn't update the Keychain Item." );
Run Code Online (Sandbox Code Playgroud)

需要成为

OSStatus status = SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)tempCheck);
NSAssert(status == noErr, @"Couldn't update the Keychain Item." );
Run Code Online (Sandbox Code Playgroud)

注意实际的SecItemUpdate如何移动到NSAssert之外,而是检查结果

重要说明:尝试更新kSecValueData的值,而不指定kSecAttrAccount的值,也会导致断言失败.因此,如果您的意图是存储单个敏感数据字符串(例如信用卡号列表),请确保在kSecAttrAccount属性中存储一些"帐户名"文本,如下所示:

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)];
}
Run Code Online (Sandbox Code Playgroud)


And*_*cci 16

当你包括

keychainWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyLoginPassword" accessGroup:nil];

[keychainWrapper setObject:usernameField.text forKey:(id)kSecAttrAccount];
[keychainWrapper setObject:passwordField.text forKey:(id)kSecValueData];
Run Code Online (Sandbox Code Playgroud)

你还必须包括

[keychainWrapper setObject:@"Myappstring" forKey: (id)kSecAttrService];
Run Code Online (Sandbox Code Playgroud)

或者我收到"SIGABRT"错误.(Myappstring)是一个定义应用程序的字符串.

也许我错过了一些东西,至少应该做一次.

  • 这个修复对我有用.弄清楚错误消息中发生了什么是很棘手的,因为如果您之前已经正确设置了这些值,则不会看到错误.只有在更改initWithIdentifier:value并且无法设置kSecAttrService时才会开始出错. (2认同)