【问题标题】:iOS keychain randomly returning -25300 error (aka errSecItemNotFound)iOS 钥匙串随机返回 -25300 错误(又名 errSecItemNotFound)
【发布时间】:2020-11-01 09:40:56
【问题描述】:

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

应用重启没有帮助,只有新用户授权。

似乎物品似乎从钥匙串中消失了。

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

这里有一些代码sn-ps:

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)
        }
    }

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

谢谢

【问题讨论】:

    标签: ios keychain


    【解决方案1】:

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

    【讨论】:

    • 谢谢你的回复,我去看看这个方法
    猜你喜欢
    • 2019-11-04
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多