91 votes

iOS KeyChain ne récupère pas les valeurs de l'arrière-plan

Je suis actuellement en train de stocker le nom d'utilisateur (e-mail) et un salée de hachage de l'e-mail et mot de passe dans l'iOS Trousseau de clés. Je suis l'aide de l'ARC'ified version trouvée ici.

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
[wrapper setObject:APP_NAME forKey:(__bridge id)kSecAttrService];
[wrapper setObject:email forKey:(__bridge id)kSecAttrAccount];
[wrapper setObject:token forKey:(__bridge id)kSecValueData];

Tout cela fonctionne très bien quand j'en ai besoin pour tirer le jeton pour mes appels réseau, tandis que l'application est active. Il travaille pour une session à partir d'un démarrage en mode minimal, ainsi que tous les appels de réseau tout au long de. Le problème commence lorsque l'application est en arrière-plan.

Gardez à l'esprit, cela ne se produit que de façon sporadique et je n'ai pas encore la broche vers le bas à une version d'iOS ou de l'appareil.

L'utilisateur voyages d'un emplacement (région de suivi) et je veux mettre à jour le serveur avec leur statut. J'ai essayer de tirer le jeton de le trousseau d'accès, de la même manière que je fais pour tous les autres d'appel du réseau, et de mettre à jour le statut. Mais pour certains utilisateurs, la valeur est nulle. Sans elle, je ne peux pas mettre à jour le réseau des trucs. Pourquoi serait-ce de travailler pour la plupart, mais pas pour un petit pourcentage?

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
NSString *token = [wrapper objectForKey:(__bridge id)kSecValueData];

J'ai repris le non-ARC version de la keychainwrapper, mais j'ai toujours les mêmes résultats. Je vous serais reconnaissant de tout commentaire. C'est seulement une petite partie de mes utilisateurs, mais c'est une question que je voudrais corriger et ne pas s'inquiéter. Merci à l'avance.

Aussi, l'ensemble de mon travail de fond est mis en place dans un backgroundTask pour empêcher les choses de l'expiration du délai. Je ne suis pas avoir de problèmes avec le travail entourant le trousseau de clés, mais je n'ai pas laisser les choses aller de l'avant jusqu'à ce que mon jeton est rempli.

MODIFIER J'ai compris mon problème avec leur trousseau de ne pas extraire les valeurs de l'arrière-plan. Je vais poster la réponse ci-dessous et les accepter comme je sens que cette question peut devenir utile à d'autres plus tard.

113voto

Bill Burgess Points 8217

Ma question était proche de la marque pour la raison, mais pas tout à fait. Après la lecture par le biais de blog après blog, tutoriel après le tutoriel, j'ai enfin trouvé un qui a donné un aperçu de ce qui se passe.

Verrouillé écrans d'accueil. Le trousseau de clés tutoriels, de toujours laisser les paramètres d'accessibilité pour le porte-clés vide, donc il s'agit par défaut d'Apple le plus bas/le plus sûr du niveau d'accès. Ce niveau ne permet pas de trousseau d'accès si l'utilisateur a un mot de passe sur l'écran de verrouillage. Bingo! C'est ce qui explique le comportement sporadique et pourquoi cela n'arrive qu'à un petit pourcentage d'utilisateurs.

Une seule ligne de code, règle la totalité du gâchis.

[wrapper setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(__bridge id)kSecAttrAccessible];

Ajoutez cette ligne où je suis en paramètre le nom d'utilisateur et le mot de passe. Fonctionne comme un charme. Espérons que cela aidera quelqu'un là-bas. Il a confondu moi pendant un certain temps jusqu'à ce que j'ai pu mettre les morceaux ensemble.

69voto

woof Points 284

Utilisation kSecAttrAccessibleAfterFirstUnlock au lieu de kSecAttrAccessibleAlways.

À partir d'Apple document: SecAttrAccessibleAfterFirstUnlock Les données dans le trousseau d'accès de l'élément ne peut pas être accessible après un redémarrage jusqu'à ce que l'appareil a été débloqué une fois par l'utilisateur.

Après la première débloquer, les données restent accessibles jusqu'au prochain redémarrage. Ceci est recommandé pour les articles qui doivent être accessibles par des applications en arrière-plan. Articles avec cet attribut de migrer vers un nouvel appareil lors de l'utilisation des sauvegardes cryptées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X