我不能将NSDictionary,CFDictionaryRef和NSMutableDictionary转发给SecItemAdd()

时间:2014-12-24 23:05:02

标签: ios swift keychain

我对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,或基本上CFDictionaryAnyObject对基金会的影响。

之后,我继续创建一个名为id的空变量,其类型为result。该变量将保持{118}的OSStatus函数的结果。

但是,我收到以下错误: AddSecItem()

我不知道这意味着什么,我无法弄明白。世界上我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

我不知道SecItemAdd的参数供应,​​但你需要更多像

这样的东西
var idontknow = UnsafeMutablePointer<Unmanaged<AnyObject>?>()
result = SecItemAdd(keychainDictionary!, idontknow)

尝试从文档中找出idontknow究竟是什么。