我想使用Swift將項目添加到iOS鑰匙串,但無法弄清楚如何正確鍵入轉換。如下使用Swift將項目添加到鑰匙串
NSData *secret = [@"top secret" dataWithEncoding:NSUTF8StringEncoding];
NSDictionary *query = @{
(id)kSecClass: (id)kSecClassGenericPassword,
(id)kSecAttrService: @"myservice",
(id)kSecAttrAccount: @"account name here",
(id)kSecValueData: secret,
};
OSStatus = SecItemAdd((CFDictionaryRef)query, NULL);
試圖做到這一點在斯威夫特:
var secret: NSData = "Top Secret".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
var query: NSDictionary = [
kSecClass: kSecClassGenericPassword,
kSecAttrService: "MyService",
kSecAttrAccount: "Some account",
kSecValueData: secret
]
產生了錯誤「無法表達的類型‘詞典’轉換爲從WWDC 2013屆709,給出下面的Objective-C代碼「DictionaryLiteralConvertible」。
我把另一種方法是用斯威夫特和字典的- setObject:forKey:
方法與關鍵kSecClass添加kSecClassGenericPassword。
在Objective-C:
NSMutableDictionary *searchDictionary = [NSMutableDictionary dictionary];
[searchDictionary setObject:(id)kSecClassGenericPassword forKey:(id)kSecClass];
在Objective-C代碼,各種鑰匙串項目類鍵的CFTypeRef是橋連的過度使用的ID。在Swift documentation中提到Swift將id導入爲AnyObject。然而,當我試圖將kSecClass作爲AnyObject的方法downcast時,我得到的錯誤是「Type'AnyObject'不符合NSCopying。
任何幫助,無論是直接的答案還是關於如何與Core進行交互的指導基金類型,將不勝感激。
EDIT 2
這個解決方案是不作爲的Xcode 6 Beta 2版的如果您正在使用Beta 1的下面的代碼可以工作更長時間有效。
var secret: NSData = "Top Secret".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
let query = NSDictionary(objects: [kSecClassGenericPassword, "MyService", "Some account", secret], forKeys: [kSecClass,kSecAttrService, kSecAttrAccount, kSecValueData])
OSStatus status = SecItemAdd(query as CFDictionaryRef, NULL)
要使用Keychain Item屬性鍵作爲字典鍵,必須使用takeRetainedValue或takeUnretainedValue(根據需要)解開它們。然後你可以將它們投射到NSCopying。這是因爲它們是頭中的CFTypeRefs,它們不是全部可複製的。
但是從Xcode 6 Beta 2開始,這會導致Xcode崩潰。
嗨。你能否讓我知道下面是如何被接受的答案?我有與上面顯示的相同的代碼,但無論我做什麼,我都無法讀取或向KeyChain添加項目。您是否可以使用解決方案更新代碼,以確定您是如何專門將項目保存在鑰匙串中的?提前致謝。 – Darren
@達倫。我編輯了我的問題以包含答案。在第二次編輯之前,我接受了下面的答案,所以我沒有試圖通過向下轉換文字來實現它。 –
@PasanPremaratne嗨,我正在嘗試做同樣的事情,但它在Beta 2中不起作用,您是否找到了解決方案?謝謝 – Xerxes