(我使用Swift。)
我将以下Dictionary
传递给SecItemAdd()
。
var attributes = [kSecClass as String: kSecClassInternetPassword,
kSecAttrAccessible: kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
kSecAttrDescription: "Alexander's Application Account Password",
kSecAttrAccount: self.usernameField.text, /* This is an outlet to a UITextField */
kSecAttrServer: "http://www.hausofalexander.tk/", /* This is my servers' domain */
kSecAttrAuthenticationType: kSecAttrAuthenticationTypeHTTPBasic,
kSecValueData: self.passwordField.text]; /* This is also and outlet to a UITextField */
然后我致电SecItemAdd(attributes as CFDictionaryRef, nil)
我收到errSecParam
(错误-50
),因为我将无效参数(在这种情况下为attributes
)传递给SecItemAdd()
。我假设这是因为我kSecValueData
变量中attributes
的一对不适用于iOS的kSecClassInternetPassword
根据参考: Make sure you scroll down a bit to the kSecClassInternetPassword
item to see the applicable attributes for a kSecClass
of this type.
但是,我完全能够使用kSecValueData
作为属性并使用Cocoa为其设置值(如在Mac开发中)。我已经制作了一个Mac应用程序来测试它然后用Keychain Access查找项目,发现它确实存在。但是,这是使用kSecClass
kSecClassGenericPassword
(我不知道这是否相关,但这个测试应用程序我是用Objective-C编写的)。此时,如果我在iOS应用程序中使用kSecClassGenericPassword
,我决定检查哪些属性可用。遗憾的是,kSecValueData
也无法使用kSecClass
。
因此,如果kSecValueData
不适用于kSecClassGenericPassword
,kSecClassInternetPassword
或任何其他kSecClass
项的适用属性,我在世界的哪个位置设置密码?
我注意到我允许kSecAttrGeneric
使用这些kSecClass
项(即kSecClassGenericPassword
和kSecClassInternetPassword
)并且它需要一个值CFDataRef
。我假设这意味着我希望将NSData
(作为CFDataRef
)传递给此属性,但我将如何传递给NSData
?那应该是Dictionary
吗?这应该是密码NSASCIIStringEncoding
的{{1}}值吗?这是否意味着我可以自己制作任何String
值?
感谢阅读。如果我对你感到困惑,请告诉我,我会愉快地解释一下。