Per rendere il Portachiavi condiviso in Xcode 8.
1) nel vostro obiettivo App in capacità di trovare e attivare il "portachiavi Sharing", aggiungere una chiave portachiavi Group (una stringa stile reverse-dominio come com.myappdomain.myappname)
2) Fai esattamente lo stesso per il target di estensione. Assicurati che il tasto Keychain Group sia lo stesso per entrambi: l'app e l'estensione.
Aggiungere e recuperare i dati da Keychain nel modo consueto, senza modifiche speciali richieste nel codice. Ad esempio, ecco come ho messo i dati in portachiavi in app principale (un po 'vecchio stile, ma funziona ancora a Swift 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)
E poi recuperarlo nel prolungamento:
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
}
}
Nota che dovrai ancora passare "login" e "dominio" sull'estensione per identificare la registrazione corretta. Questo può essere fatto tramite NSUserDefaults. Vedi this answer su come farlo.
È molto utile non collegare ad altri siti Web o almeno aggiungere la fonte pertinente alla risposta, tale collegamento non è più disponibile. – leolobato
C'è un bel po 'di informazioni lì, non ho intenzione di distillare e incollare, ma ecco la versione di Internet Archive: https://web.archive.org/web/20141028160328/http://dasdev.de/2014/ 08/12/ios8-share-extension-with-a-shared-keychain –
Il repository GitHub è ancora lì https://github.com/dasdom/KeychainDemo anche –