J'ai un écran de connexion dans mon application iOS. Le nom d'utilisateur et le mot de passe seront enregistrés dans le NSUserDefaults
et seront à nouveau chargés dans l'écran de connexion lorsque vous entrez à nouveau dans l'application (bien sûr, ils NSUserDefaults
sont permanents).
Maintenant, l'utilisateur a la possibilité de désactiver la fonction d'enregistrement du nom d'utilisateur / mot de passe.
Le NSUserDefaults
sera alors effacé.
Mais dans mon application, j'ai besoin de ce nom d'utilisateur / mot de passe pour les requêtes de base de données pour l'utilisateur. Donc: où stocker les données sauf NSUserDefaults
? (Cet endroit peut / devrait être supprimé lorsque l'utilisateur quitte l'application ou se déconnecte).
Réponses:
Vous devez toujours utiliser le trousseau pour stocker les noms d'utilisateur et les mots de passe, et comme il est stocké en toute sécurité et uniquement accessible à votre application, il n'est pas nécessaire de le supprimer lorsque l'application se ferme (si cela vous préoccupait).
Apple fournit un exemple de code qui stocke, lit et supprime les éléments de trousseau et voici comment utiliser la classe wrapper de trousseau de cet exemple, ce qui simplifie considérablement l'utilisation du trousseau.
Incluez Security.framework (dans Xcode 3, faites un clic droit sur le dossier des frameworks et ajoutez un framework existant. Dans Xcode 4, sélectionnez votre projet, puis sélectionnez la cible, allez dans l'onglet Build Phases et cliquez sur + sous Link Binary With Files) et KeychainItemWrapper .h &. m fichiers dans votre projet, # importez le fichier .h partout où vous devez utiliser le trousseau, puis créez une instance de cette classe:
( YourAppLogin peut être tout ce que vous avez choisi d'appeler votre élément de trousseau et vous pouvez avoir plusieurs éléments si nécessaire)
Ensuite, vous pouvez définir le nom d'utilisateur et le mot de passe en utilisant:
Obtenez-les en utilisant:
Ou supprimez-les en utilisant:
la source
kSecValueData
et lekSecAttrAccount
code Objective-C, alors assurez-vous de les transtyper en utilisant(__bridge id)
, par exemple,[keychainItem setObject:obj forKey:(__bridge id)kSecValueData];
Si vous avez besoin d'une version ARC du wrapper voici le lien https://gist.github.com/1170641 Merci à
la source
Une solution très simple via des porte-clés .
C'est un simple wrapper pour le trousseau du système. Il suffit d' ajouter les
SSKeychain.h
,SSKeychain.m
,SSKeychainQuery.h
et lesSSKeychainQuery.m
fichiers à votre projet et ajoutez le Security.framework à votre cible.Pour enregistrer un mot de passe:
Pour récupérer un mot de passe:
Où
setPassword
est la valeur que vous souhaitez enregistrer etforService
quelle est la variable sous laquelle vous voulez qu'il soit enregistré et le compte est pour quel utilisateur / objet le mot de passe et toute autre information sont destinés.la source
NSString *username = [[SSKeychain accountsForService:@"AnyService"][0] valueForKey:@"acct"]
. Cela devrait fonctionner correctement si vous n'utilisez qu'un seul compte. Comme toujours, assurez-vous de vérifier la longueur du tableau avant d'essayer d'accéder à l'index 0.Vous pouvez simplement l'utiliser
NSURLCredential
, il enregistrera le nom d'utilisateur et le mot de passe dans le trousseau en seulement deux lignes de code .Voir ma réponse détaillée .
la source
J'ai décidé de répondre à la façon d'utiliser le trousseau dans iOS 8 en utilisant Obj-C et ARC.
1) J'ai utilisé le keychainItemWrapper (version ARCifief) de GIST: https://gist.github.com/dhoerl/1170641/download - Ajoutez (+ copie) le KeychainItemWrapper.h et .m à votre projet
2) Ajoutez le cadre de sécurité à votre projet (archivez le projet> Phases de construction> Lier le binaire aux bibliothèques)
3) Ajoutez la bibliothèque de sécurité (#import) et KeychainItemWrapper (#import "KeychainItemWrapper.h") au fichier .h et .m dans lequel vous souhaitez utiliser le trousseau.
4) Pour enregistrer les données dans le trousseau:
5) Lire les données (probablement l'écran de connexion lors du chargement> viewDidLoad):
Prendre plaisir!
la source
Si vous rencontrez un problème lors de la récupération du mot de passe à l'aide de l'encapsuleur de trousseau, utilisez ce code:
la source
vérifier cet exemple de code, j'ai d'abord essayé le wrapper de la pomme à partir de l'exemple de code, mais c'est beaucoup plus simple pour moi
la source
essaye celui-là:
puisse-t-il aider.
la source
J'ai envisagé d'utiliser KeychainItemWrapper (la version ARC) mais je n'ai pas trouvé son wrapper Objective C aussi sain que souhaité.
J'ai utilisé cette solution de Kishikawa Katsumi , ce qui signifie que j'ai écrit moins de code et que je n'ai pas eu besoin de transtypages pour stocker les valeurs NSString.
Deux exemples de stockage:
Deux exemples de récupération
la source
Il y a un petit bug dans le code ci-dessus (au fait, Dave, cela a été très utile, merci)
Dans la partie où nous enregistrons les informations d'identification, il a également besoin du code suivant pour fonctionner correctement.
très probablement parce que la deuxième fois que nous essayons de (re) connecter avec les mêmes informations d'identification, il les trouve déjà attribuées dans les éléments du trousseau et l'application se bloque. avec le code ci-dessus, cela fonctionne comme un charme.
la source
Pour mettre à jour cette question:
Pour ceux qui utilisent Swift Checkout, cette implémentation rapide de glisser-déposer par Mihai Costea prend en charge les groupes d'accès:
https://github.com/macostea/KeychainItemWrapper.swift/blob/master/KeychainItemWrapper.swift
Avant d'utiliser le trousseau: pensez à deux fois avant de stocker les mots de passe. Dans de nombreux cas, le stockage d'un jeton d'authentification (tel qu'un identifiant de session de persistance) et le nom de messagerie ou de compte peuvent être suffisants. Vous pouvez facilement invalider les jetons d'authentification pour bloquer tout accès non autorisé, obligeant l'utilisateur à se reconnecter sur l'appareil compromis mais pas à réinitialiser le mot de passe et à se reconnecter sur tous les appareils (nous n'utilisons pas seulement Apple, n'est-ce pas?).
la source
Mais, maintenant, vous pouvez opter pour NURLCredential au lieu de l'encapsuleur de trousseau. Il fait ce que nous devons faire.
la source
Pour swift, vous pouvez utiliser cette bibliothèque:
https://github.com/jrendel/SwiftKeychainWrapper
Il prend en charge toutes les versions de swift.
la source
Les éléments suivants devraient très bien fonctionner:
la source