爲了使鑰匙扣在Xcode 8.
1)共享在你的應用目標在功能找到並打開「鑰匙扣共享」,添加一個鑰匙串組密鑰(反向域風格串等com.myappdomain.myappname)
2 )對擴展目標完全相同。確保鑰匙串組密鑰對於應用和擴展都是相同的。
以通常的方式添加和檢索Keychain中的數據,代碼中無需進行特殊更改。例如,這裏是我如何把數據放到鑰匙串在主應用程序(有點老套,但是在斯威夫特3仍然有效):
let login = loginString
let domain = domainString
let passwordData: Data = passwordString.data(using: String.Encoding.utf8, allowLossyConversion: false)!
let keychainQuery: [NSString: NSObject] = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: login as NSObject, // login and domain strings help identify
kSecAttrService: domain as NSObject, // the required record in the Keychain
kSecValueData: passwordData as NSObject]
SecItemDelete(keychainQuery as CFDictionary) //Deletes the item just in case it already exists
let keychainSaveStatus: OSStatus = SecItemAdd(keychainQuery as CFDictionary, nil)
然後在擴展檢索:
let keychainQuery: [NSString: NSObject] = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: login as NSObject,
kSecAttrService: domain as NSObject,
kSecReturnData: kCFBooleanTrue,
kSecMatchLimit: kSecMatchLimitOne]
var rawResult: AnyObject?
let keychain_get_status: OSStatus = SecItemCopyMatching(keychainQueryForPass as CFDictionary, &rawResult)
if (keychain_get_status == errSecSuccess) {
if let retrievedData = rawResult as? Data,
let password = String(data: retrievedData, encoding: String.Encoding.utf8) {
// "password" contains the password string now
}
}
請注意,您仍然需要將「登錄」和「域」傳遞給擴展,以便識別正確的記錄。這可以通過NSUserDefaults完成。有關如何操作,請參閱this answer。
這是非常有用的不鏈接到其他網站或至少添加相關的來源的答案,該鏈接不再可用。 – leolobato 2015-07-29 14:30:14
這裏有相當多的信息,我不喜歡蒸餾和粘貼,但這裏是Internet Archive版本:https://web.archive.org/web/20141028160328/http://dasdev.de/2014/ 08/12/ios8-share-extension-with-a-shared-keychain – 2015-07-30 15:12:22
GitHub repo仍然存在https://github.com/dasdom/KeychainDemo太 – 2015-10-22 09:55:30