KeychainWrapperItem 在 iOS 7.1 中停止工作

Posted

技术标签:

【中文标题】KeychainWrapperItem 在 iOS 7.1 中停止工作【英文标题】:KeychainWrapperItem stopped working in iOS 7.1 【发布时间】:2014-03-10 20:35:06 【问题描述】:

我最近安装了 ios 7.1 模拟器和新的 Xcode 5.1。我的应用程序在 iOS 7 中运行良好。我正在使用 Apple 的 KeychainItemWrapper 类。 更新后它崩溃并显示以下消息:

*** Assertion failure in -[KeychainItemWrapper writeToKeychain]

具体在第 299 行:

NSAssert( result == noErr, @"Couldn't update the Keychain Item." );

听到错误 -25300 (errSecItemNotFound)

我在我的权利文件中指定了钥匙串访问组。此错误仅发生在 iOS 7.1 模拟器中,不会在真正的 iPhone 或 7.0 模拟器中发生。

有谁知道 Keychain 在 7.1 中发生了什么变化?

【问题讨论】:

【参考方案1】:

KeychainItemWrapper 是一个充满错误的旧实现。我建议使用另一个包装器,或者自己编写。

话虽如此,我曾经有很多错误,但不是这个。基本上发生的事情是在保存它时检查您的项目是否已经在钥匙串中,以便添加它或只是更新它。即使项目完全不同,这里检查也会返回 true,因此它无法更新,因为 SecItemUpdate 认为它不存在。

你应该做的是重置你的钥匙串,你有两个选择:

在模拟器上 Menu Simulator->重置内容和设置

在代码中的某处运行这个 sn-p:

基于 Vegard 的回答 Reset An iPhone App's Keychain

-(void)resetKeychain 
     [self deleteAllKeysForSecClass:kSecClassGenericPassword];
     [self deleteAllKeysForSecClass:kSecClassInternetPassword];
     [self deleteAllKeysForSecClass:kSecClassCertificate];
     [self deleteAllKeysForSecClass:kSecClassKey];
     [self deleteAllKeysForSecClass:kSecClassIdentity];


-(void)deleteAllKeysForSecClass:(CFTypeRef)secClass 
     NSMutableDictionary* dict = [NSMutableDictionary dictionary];
    [dict setObject:(__bridge id)secClass forKey:(__bridge id)kSecClass];
    OSStatus result = SecItemDelete((__bridge CFDictionaryRef) dict);
     NSAssert(result == noErr || result == errSecItemNotFound, @"Error deleting keychain data (%ld)", result);

【讨论】:

你很亲密。错误代码是 25300。我编辑了我的问题。你知道一个值得推荐的 Keychain Wrapper 吗? SSKeychain 很受欢迎,而且使用简单。 非常感谢。我认为重要的是要知道重置位置和隐私没有起作用。只有在使用代码 sn-p 删除所有键后,我现在才能运行我的应用程序。 我确实更新了我的答案,它是通过重置模拟器菜单中可用的内容和设置,而不是模拟器本身。【参考方案2】:

钥匙串在 iOS 7.1 下仍然有效。您的问题与模拟器本身有关。据我所知,模拟器不允许存储某些键,这在 iOS 7.0 和 iOS 7.1 之间是一致的。

如果你在真机上运行你的应用,崩溃就会消失。

【讨论】:

确实如此。但是为什么会在 7.1 模拟器上崩溃?也可以在模拟器中运行我的应用程序。

以上是关于KeychainWrapperItem 在 iOS 7.1 中停止工作的主要内容,如果未能解决你的问题,请参考以下文章

iOS - NSInternalInconsistencyException 在 iOS 9 和 10 上发生,但在 iOS 11 上运行良好

iOS8 扩展 - 在 iOS 5/6/7 上会发生啥?

如何在 iOS 4 上运行 iOS 5/ARC 项目

iOS 纵横比约束在 iOS 7 上中断,适用于 iOS 8

iOS 5 MapKit,MKPlacemark,在 iOS 5 上运行 iOS 4.3 应用程序

[iOS] 在 ios10 中使用 imessage