我对Keychain不太了解。据我所知,您希望将CFDictionaryRef
发送到SecItemAdd()
以将属性存储在应用程序的钥匙串中。我可能不理解展开或其他什么。我觉得答案很明显,但这是我第一次体验这么低级别的事情,所以请耐心等待我。 :)
这是我的Swift:
var keychainDictionary : NSMutableDictionary? = NSMutableDictionary()
var username = "Arcrammer"
var password = "somePassword"
var site = "http://www.hausofalexander.tk/"
// Item class
keychainDictionary![(kSecClass as String)] = kSecClassInternetPassword
// Attributes
keychainDictionary![(kSecAttrAccount as String)] = username
keychainDictionary![(kSecAttrService as String)] = "Haus"
keychainDictionary![(kSecAttrAccessible as String)] = kSecAttrAccessibleWhenUnlockedThisDeviceOnly as CFTypeRef)
keychainDictionary![(kSecMatchCaseInsensitive as String)] = (kCFBooleanTrue asCFTypeRef)
keychainDictionary![(kSecReturnData as String)] = (kCFBooleanTrue as CFTypeRef)
// Completely mutable NSDictionary from the NSMutableDictionary
var result : OSStatus?
SecItemAdd(keychainDictionary!, result)
我创建了一个空的可选NSMutableDictionary()
来保存Keychain字典的属性和值。接下来,我添加一些kSecAttr-
值作为键添加到字典中。我也将它们转换为String
,因为如果我尝试将它们作为LoginViewController.swift:112:37: Type 'CFStringRef' does not conform to protocol 'NSCopying'
或者我根本不尝试转换它们,编译器会抛出错误CFTypeRef
。当然,String
符合NSCopying
协议。我不知道这是否会对属性值产生影响,但它肯定会消除错误。
之后我继续以String
数据类型传递信息。从我收集的内容(不是很多,tbh)CFTypeRef
是一个枚举,而kCFBooleanTrue
之类的返回数据将返回该枚举的类型值,类似于{{ 1}},CFBoolean
,或基本上CFDictionary
或AnyObject
对基金会的影响。
之后,我继续创建一个名为id
的空变量,其类型为result
。该变量将保持{118}的OSStatus
函数的结果。
但是,我收到以下错误:
AddSecItem()
我不知道这意味着什么,我无法弄明白。世界上我在这里做错了什么?
答案 0 :(得分:0)
我不知道SecItemAdd
的参数供应,但你需要更多像
var idontknow = UnsafeMutablePointer<Unmanaged<AnyObject>?>()
result = SecItemAdd(keychainDictionary!, idontknow)
尝试从文档中找出idontknow
究竟是什么。