Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios kSecAttrAccount和kSecAttrGeneric_Ios_Swift_Security_Keychain - Fatal编程技术网

Ios kSecAttrAccount和kSecAttrGeneric

Ios kSecAttrAccount和kSecAttrGeneric,ios,swift,security,keychain,Ios,Swift,Security,Keychain,我想把钱存到一个账户里marta@domain.com两个价值观。词典示例: 值1。 kSecAttrAccount=marta@domain.com kSecAttrGeneric=value1Key kSecValueData=value1 值2。 kSecAttrAccount=marta@domain.com kSecAttrGeneric=value2Key kSecValueData=value2 可能吗?当我试图保留第二个值时,执行查询时出错 我附加了一段代码: func

我想把钱存到一个账户里marta@domain.com两个价值观。词典示例:

  • 值1。
kSecAttrAccount=marta@domain.com

kSecAttrGeneric=value1Key

kSecValueData=value1

  • 值2。
kSecAttrAccount=marta@domain.com

kSecAttrGeneric=value2Key

kSecValueData=value2


可能吗?当我试图保留第二个值时,执行查询时出错

我附加了一段代码:

func addCredentials(_ credentials: KeychainCredentials) throws {

let account = credentials.account
let password = credentials.password.data(using: String.Encoding.utf8)!
let generic = credentials.generic

 let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault, 
            kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
            .userPresence,
            nil) 

 // Build the query
 let query: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
                                    kSecAttrService as String: serviceName,
                                    kSecAttrAccount as String: account,
                                    kSecAttrGeneric as String: generic,
                                    kSecAttrAccessControl as String: accessControl as Any,
                                    kSecValueData as String: password]

let status = SecItemAdd(query as CFDictionary, nil)
guard status == errSecSuccess else { throw KeychainError(status: status) }

}

对于
kSecClassGenericPassword
,服务和帐户的组合必须是唯一的。有关哪些属性是主键的一部分的列表,请参阅的文档

当给定钥匙链已经具有具有相同组合主键集的相同类别的项目时,系统将该项目视为该钥匙链的副本。每一类keychain项都有一组不同的主键,尽管在所有类中有一些属性是通用的。特别是,在适用的情况下,kSecAttrSynchronizable和kSecAttrAccessGroup是主键集的一部分。下面列出了其他每类主键:

对于通用密码,主键包括kSecAttrAccount和kSecAttrService

对于internet密码,主键包括kSecAttrAccount、kSecAttrSecurityDomain、kSecAttrServer、kSecAttrProtocol、kSecAttrAuthenticationType、kSecAttrPort和kSecAttrPath

对于证书,主键包括kSecAttrCertificateType、kSecAttrIssuer和kSecAttrSerialNumber

对于关键项,主键包括kSecAttrKeyClass、kSecAttrKeyType、KSECATTRAPPLICATION标签、KSECATTRAPPLICATION标签、kSecAttrKeySizeInBits和kSecAttrEffectiveKeySize

对于绑定在一起的证书和私钥等标识项,主键与证书的主键相同。由于私钥可以多次认证,因此证书的唯一性决定身份的唯一性

如果我正在构建它,我可能会将所有键/值放入一个字典中,并将其序列化到单个kSecAttrAccount记录中

或者,您可以将您的帐户和服务值合并到帐户中(如果您有服务),并将
value1Key
放入服务属性中。然后,帐户+服务对于给定的键是唯一的。

非常感谢您,Rob(:我将开发第一个选项,一个包含所有键/值的字典。