首页 > 解决方案 > iOS 钥匙串随机返回 -25300 错误(又名 errSecItemNotFound)

问题描述

我的应用程序面临一个奇怪的钥匙串行为:有时它返回-25300状态而不是肯定存在的凭据。结果:已登录的用户随机变为“注销”。

应用重启无济于事,只有新用户授权。

不知何故,物品似乎从钥匙串中消失了。

在仔细查看了从钥匙串中保存和读取数据的代码并将其与 Apple 的示例进行比较后,我注意到我们kSecAttrService在保存kSecClassGenericPassword.

这里有一些代码片段:

func saveData(_ data: Data, for key: String) -> OSStatus {
        let query: [CFString : Any] = [
            kSecClass: kSecClassGenericPassword,
            kSecAttrAccount: key,
            kSecValueData: data,
            kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly
        ]
        return SecItemAdd(query as CFDictionary, nil)
    }
func readData(for key: String) -> String? {
        let query: [CFString: Any] = [
            kSecClass: kSecClassGenericPassword,
            kSecAttrAccount: key,
            kSecReturnData: kCFBooleanTrue as Any,
            kSecMatchLimit: kSecMatchLimitOne
        ]
        var result: AnyObject?
        _ = withUnsafeMutablePointer(to: &result) {
            SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
        }
        return (result as? Data).flatMap {
            String(data: $0, encoding: .utf8)
        }
    }

kSecAttrService那么,保存项目时缺少可能是kSecClassGenericPassword钥匙串项目由于某种原因变得无法访问的原因,还是有任何其他原因?

谢谢

标签: ioskeychain

解决方案


使用kSecAttrAccessibleWhenUnlockedThisDeviceOnly标志时,您必须确保受保护的数据可用。有一种方法可以AppDelegate在此事件发生时通知您,或者您可以添加一个观察者并侦听该事件protectedDataDidBecomeAvailableNotification。委托方法的文档可以在这里找到,通知的文档可以在这里找到。


推荐阅读