我一直在围绕Apple论坛挖掘这个问题无济于事.使用Apple的KeychainItemWrapper(ARCified),尝试将kSecAttrAccessible属性设置为除default(kSecAttrAccessibleWhenUnlocked)之外的任何内容会导致SecItemUpdate返回错误的断言失败.
KeychainItemWrapper *wrapper = [[KeyChainItemWrapper alloc] initWithIdentifier:kMyIdentifier accessGroup:nil];
[wrapper setObject:kMyServiceName forKey:(__bridge NSString*)kSecAttrService];
[wrapper setObject:kMyAccountToken forKey:(__bridge NSString*)kSecAttrAccount];
[wrapper setObject:(__bridge NSString*)kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly forKey:(__bridge NSString*)kSecAttrAccessible];
Run Code Online (Sandbox Code Playgroud)
其余的钥匙串更新似乎正常,但最后一行导致:
*** Assertion failure in -[KeychainItemWrapper writeToKeychain], /Users/john.hammerlund/.../KeychainItemWrapper.m:299
Run Code Online (Sandbox Code Playgroud)
断言失败是由于SecItemUpdate()返回-50的状态,这似乎是一个通用的"无效参数"错误.
立即设置kSecAttrAccessible密钥没有任何影响,但将其设置为默认值可以kSecAttrAccessibleWhenUnlocked缓解问题(但消除了这一点). 另一个问题是我发现的与iOS 8有关的唯一其他信息导致KeychainItemWrapper崩溃.在iOS 7/8上构建iOS 7或模拟器的设备消除了这个问题; 它只是在使用iOS 8的真实设备上迸发出来.
更新
以下是查询字典的概述:
{
accc = "<SecAccessControlRef: 0x1687cc70>";
acct = ...;
agrp = ...;
cdat = "2014-10-13 22:22:47 +0000";
desc = "";
gena = ...;
labl = "";
mdat = "2014-10-13 22:34:16 +0000";
pdmn = …