Come si imposta l'accesso del portchiavi a essere kSecAttrAccessibleAfterFirstUnlock in Swift?

Cerca su Google ma non riesci a trovare nulla su come impostare questo attributo per il portchiavi in ​​swift. Ci sono alcuni frammenti su di esso con Obj-C, ma cercare di trovare una corrispondenza tra l'uso di Swift del portchiavi e Obj-C è quasi imansible.

Ho un codice esistente (dalla documentazione di Realm Swift) per impostare una chiave di crittografia, ma voglio impostare l'accesso da predefinito a kSecAttrAccessibleAfterFirstUnlock.

class func getKey() -> NSData { let keychainIdentifier = "Realm.EncryptionKey" let keychainIdentifierData = keychainIdentifier.data(using: String.Encoding.utf8, allowLossyConversion: false)! // First check in the keychain for an existing key var query: [NSString: AnyObject] = [ kSecClass: kSecClassKey, kSecAttrApplicationTag: keychainIdentifierData as AnyObject, kSecAttrKeySizeInBits: 512 as AnyObject, kSecReturnData: true as AnyObject ] var dataTypeRef: AnyObject? var status = withUnsafeMutablePointer(to: &dataTypeRef) { SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0)) } if status == errSecSuccess { return dataTypeRef as! NSData } // No pre-existing key from this application, so generate a new one let keyData = NSMutableData(length: 64)! let result = SecRandomCopyBytes(kSecRandomDefault, 64, keyData.mutableBytes.bindMemory(to: UInt8.self, capacity: 64)) assert(result == 0, "Failed to get random bytes") // Store the key in the keychain query = [ kSecClass: kSecClassKey, kSecAttrApplicationTag: keychainIdentifierData as AnyObject, kSecAttrKeySizeInBits: 512 as AnyObject, kSecValueData: keyData ] status = SecItemAdd(query as CFDictionary, nil) return keyData } 

Solutions Collecting From Web of "Come si imposta l'accesso del portchiavi a essere kSecAttrAccessibleAfterFirstUnlock in Swift?"

Aggiungi kSecAttrAccessible: kSecAttrAccessibleAfterFirstUnlock al dictionary di query che usi per aggiungere la chiave.

Se si desidera aggiornare lo stato di accessibilità dopo che è stato già aggiunto, è necessario specificare le chiavi kSecValueData e kSecAttrAccessible nel dictionary che si passa a SecItemUpdate .