Magasin NSDictionary dans le trousseau d'accès
Il est possible de stocker une NSDictionary
dans le iPhone
trousseau, à l'aide de KeychainItemWrapper
(ou sans)?
Si il n'est pas possible, avez vous une autre solution?
- Oui, mais quand je lis des données, j'ai une référence à un vide NSString.
Vous devez vous connecter pour publier un commentaire.
Vous devez correctement sérialiser les
NSDictionary
avant de le ranger dans le Trousseau d'accès.Aide:
vous allez vous retrouver avec un
NSDictionary
collection de seulementNSString
objets. Si vous souhaitez conserver les types de données des objets, vous pouvez utiliserNSPropertyListSerialization
.La
NSDictionary
retourné par l'appel de la deuxième àNSPropertyListSerialization
maintiendra types de données d'origine dans leNSDictionary
collection.kSecAttrService
, ce qui n'est pas un champ crypté. Je crois que vous vouliez utiliserkSecValueData
ici, qui est la charge utile cryptée.NSData
pour clékSecValueData
rompt leKeychainItemWrapper
, en interne, il s'attend à une valeur deNSString
pour cette clé (c'est à dire, un mot de passe). C'est parce qu'il a besoin de chiffrer la charge utile dekSecValueData
, et avant qu'elle puisse le faire il a besoin pour le convertir enNSData
. Par conséquent, laKeychainItemWrapper
fait déjà[payloadString dataUsingEncoding:NSUTF8StringEncoding]
en interne, et si vous passezNSData
commepayloadString
, vous aurez uneUnrecognized selector sent to instance exception
. Découvrez ma réponse sur cette page pour plus de détails et une solution.À l'aide de la
KeychainItemWrapper
dépendance nécessite une modification de la bibliothèque/exemple de code pour accepterNSData
que la charge utile cryptée, ce qui n'est pas dans l'avenir. Aussi, en faisant leNSDictionary > NSData > NSString
de conversion de la séquence, de sorte que vous pouvez utiliserKeychainItemWrapper
est inefficace:KeychainItemWrapper
va convertir votre chaîne àNSData
de toute façon, pour le chiffrer.Voici une solution complète qui permet de résoudre le ci-dessus en utilisant le trousseau de la bibliothèque directement. Il est implémenté comme une catégorie de sorte que vous l'utiliser comme ceci:
et voici la Catégorie:
En fait, vous pouvez modifier facilement pour stocker toute sorte d'objet sérialisable dans le trousseau d'accès, et pas seulement un dictionnaire. Juste faire une
NSData
représentation de l'objet que vous souhaitez stocker.Fait quelques petites modifications à Dts catégorie. Converti à l'ARC et à l'aide de NSKeyedArchiver pour stocker des objets personnalisés.
Encodage :
[dic description]
Décodage :
[dic propertyList]
Vous pouvez stocker quoi que ce soit, vous avez juste besoin de sérialiser.
Vous devriez être en mesure de stocker des données dans le trousseau d'accès.
J'ai trouvé que le trousseau de clés wrapper ne veut que des chaînes de caractères. Même pas NSData. Afin de stocker un dictionnaire, vous aurez à faire comme Bret suggéré, mais avec une étape supplémentaire pour convertir le NSData la sérialisation d'une chaîne de caractères. Comme ceci:
En les lisant:
J'ai ajouté de l'accès des groupes de soutien et de simulateur de sécurité à Amols solution: