iOS Ajouter un mot de passe au trousseau


Exemple

Chaque élément de trousseau est le plus souvent représenté comme un CFDictionary . Vous pouvez, cependant, simplement utiliser NSDictionary dans Objective-C et profiter du pontage ou, dans Swift, vous pouvez utiliser Dictionary et le CFDictionary explicitement dans CFDictionary .

Vous pouvez créer un mot de passe avec le dictionnaire suivant:

Rapide

var dict = [String : AnyObject]()

Tout d'abord, vous avez besoin d'une paire clé / valeur permettant au porte-clés de savoir qu'il s'agit d'un mot de passe. Notez que parce que notre clé dict est une String nous devons CFString tout CFString en String explicitement dans Swift 3. CFString ne peut pas être utilisé comme clé dans un dictionnaire Swift car il n'est pas lavable.

Rapide

dict[kSecClass as String] = kSecClassGenericPassword

Ensuite, notre mot de passe peut avoir une série d'attributs pour le décrire et nous aider à le retrouver plus tard. Voici une liste d'attributs pour les mots de passe génériques .

Rapide

// The password will only be accessible when the device is unlocked
dict[kSecAttrAccessible as String] = kSecAttrAccessibleWhenUnlocked
// Label may help you find it later
dict[kSecAttrLabel as String] = "com.me.myapp.myaccountpassword" as CFString
// Username
dict[kSecAttrAccount as String] = "My Name" as CFString
// Service name
dict[kSecAttrService as String] = "MyService" as CFString

Enfin, nous avons besoin de nos données privées réelles. Veillez à ne pas garder cela en mémoire trop longtemps. Ce doit être CFData .

Rapide

dict[kSecValueData as String] = "my_password!!".data(using: .utf8) as! CFData

Enfin, la fonction d'ajout de Keychain Services veut savoir comment renvoyer l'élément de trousseau nouvellement construit. Comme vous ne devriez pas conserver les données très longtemps en mémoire, voici comment vous ne pouvez retourner que les attributs:

Rapide

dict[kSecReturnAttributes as String] = kCFBooleanTrue

Maintenant, nous avons construit notre article. Ajoutons-le:

Rapide

var result: AnyObject?
let status = withUnsafeMutablePointer(to: &result) {
    SecItemAdd(dict as CFDictionary, UnsafeMutablePointer($0))
}
let newAttributes = result as! Dictionary<String, AnyObject>

Cela place les nouveaux attributs dans le result . SecItemAdd prend en compte le dictionnaire que nous avons SecItemAdd , ainsi qu'un pointeur vers l'endroit où nous souhaiterions obtenir notre résultat. La fonction retourne alors un OSStatus indiquant le succès ou un code d'erreur. Les codes de résultat sont décrits ici .