iOS8 + Apple的KeychainItemWrapper导致崩溃

Joh*_*ohn 8 objective-c keychain ios8

我一直在围绕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 = cku; <-- kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly svce = ...; sync = 0; tomb = 0; "v_Data" = <>; }

和attributesToUpdate参数:

{ 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 = ak; <-- kSecAttrAccessibleWhenUnlocked svce = ...; sync = 0; tomb = 0; "v_Data" = <>; }

我已经确认更改其他字段(即kSecAttrService,kSecAttrAccount)对字典中的相应字段具有相同的效果,但预期状态为0.

小智 2

我也遇到了确切的问题。给我:

OSStatus 错误 -50 - kSecAccess 和 kSecAccessControl 属性冲突

我的所有用户在应用商店更新后就崩溃了。

和彼得做了同样的事。抓取数据,删除该项目并将其作为新项目插入,而不是尝试更新现有项目。

我猜这是苹果的一个错误。

我开了一个 TSI,但他们还没有联系我。

据我了解,从 iOS7 更新到 iOS 8 的用户会发生这种情况,他们的第一个应用程序是使用 iOS7 的 XCode 编译的(在 iOS 8 发布之前),然后在 iOS8 上更新到使用 XCode 编译到 iOS8 的新应用程序。