• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 钥匙串(keychain) iOS touchId 提示两次

[复制链接]
菜鸟教程小白 发表于 2022-12-13 03:39:53 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

如果它不存在,我想将一个项目添加到钥匙串(keychain),如果它存在,我想更新它。 我通过以下查询调用 SecItemCopyMatching 来检查项目是否存在:

  NSDictionary *query = @{
                            (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
                            (__bridge id)kSecAttrService: @"myservice",
                            (__bridge id)kSecReturnData: @NO
                            };    

SecItemCopyMatching 提示用户输入 touchid/密码。 之后我需要更新再次提示用户的钥匙串(keychain)。 我可以在我的程序中存储一个 BOOL 来保存状态,但这可能与钥匙串(keychain)中的值不同步,所以我宁愿查询钥匙串(keychain)本身是否存在该项目,但我不希望用户得到双重提示.有什么办法吗?



Best Answer-推荐答案


这里的解决方法是先调用更新。除非该项目存在,否则它不会提示您。如果更新调用返回 errSecItemNotFound,则添加数据。这应该最多只提示您一次。如果您添加一个项目,它根本不应该提示您。

class func updateData(value: NSData, forKey keyName: String) -> Bool {
    let keychainQueryDictionary: NSMutableDictionary = self.setupKeychainQueryDictionaryForKey(keyName)
    let updateDictionary = [SecValueData:value]

    let status: OSStatus = SecItemUpdate(keychainQueryDictionary, updateDictionary)

    if status == errSecSuccess {
        return true
    } else if status == errSecItemNotFound {
        return setData(value, forKey: keyName)
    } else {
        return false
    }
}

class func setData(value: NSData, forKey keyName: String) -> Bool {
    var keychainQueryDictionary: NSMutableDictionary = self.setupKeychainQueryDictionaryForKey(keyName)

    keychainQueryDictionary[SecValueData] = value

    var error:Unmanaged<CFErrorRef>?
    let sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleAfterFirstUnlock, SecAccessControlCreateFlags.UserPresence, &error)
    keychainQueryDictionary[SecAttrAccessControl] = sacObject.takeRetainedValue()

    let status: OSStatus = SecItemAdd(keychainQueryDictionary, nil)

    if status == errSecSuccess {
        return true
    } else {
        return false
    }
}

private class func setupKeychainQueryDictionaryForKey(keyName: String) -> NSMutableDictionary {
    var attributes = NSMutableDictionary()
    attributes[SecClass] = kSecClassGenericPassword as String
    attributes[SecAttrService] = "Sample Service 1"
    attributes[SecUseOperationPrompt] = "Operation prompt goes here"
    attributes[SecAttrAccount] = keyName

    return attributes
}

此代码修改自 Jason Rendel 的 KeychainWrapper .

关于ios - 钥匙串(keychain) iOS touchId 提示两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27113256/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap