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



Answers

Utilisez kSecAttrAccessibleAfterFirstUnlock au lieu de kSecAttrAccessibleAlways .


De la documentation d'Apple :

kSecAttrAccessibleAfterFirstUnlock
Les données de l'élément keychain ne sont pas accessibles après un redémarrage tant que l'utilisateur n'a pas déverrouillé l'appareil une seule fois.

Après le premier déverrouillage, les données restent accessibles jusqu'au prochain redémarrage. Ceci est recommandé pour les éléments auxquels les applications d'arrière-plan doivent accéder. Les éléments avec cet attribut migrent vers un nouveau périphérique lors de l'utilisation de sauvegardes chiffrées.

Question

Je stocke actuellement le nom d'utilisateur (email) et un hash salé de l'email et du mot de passe dans le KeyChain d'iOS. J'utilise la version ARC'ified trouvée here .

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 fonctionne correctement lorsque je dois retirer le jeton pour mes appels réseau pendant que l'application est active. Cela fonctionne pour se connecter à partir d'un démarrage propre, ainsi que tous les appels réseau tout au long. Le problème commence lorsque l'application est en arrière-plan.

Gardez à l'esprit que cela ne se produit que sporadiquement et que je n'ai pas encore réussi à l'identifier sur une version ou un appareil iOS spécifique.

L'utilisateur déclenche un emplacement (surveillance de la région) et je souhaite mettre à jour le serveur avec son statut. J'essaie de sortir le jeton du porte-clés, de la même manière que pour tous les autres appels réseau, et de mettre à jour le statut. Mais pour certains utilisateurs, la valeur est nulle. Sans cela, je ne peux pas mettre à jour les choses du réseau. Pourquoi cela fonctionnerait-il pour la plupart, mais pas pour un petit pourcentage?

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

Je suis retourné à la version non ARC du keychainwrapper, mais j'ai toujours les mêmes résultats. J'apprécierais tout commentaire à ce sujet. Ce n'est qu'une petite partie de mes utilisateurs, mais c'est un problème que je voudrais réparer et ne pas s'inquiéter. Merci d'avance.

De plus, tout mon travail d'arrière-plan est mis en place dans un backgroundTask pour éviter que les choses ne disparaissent. Je n'ai aucun problème avec le travail entourant le trousseau, mais je ne laisse pas les choses aller de l'avant jusqu'à ce que mon jeton soit rempli.

EDIT J'ai trouvé mon problème avec le trousseau qui ne récupère pas les valeurs de l'arrière-plan. Je vais poster la réponse ci-dessous et l'accepter car je pense que cette question pourrait devenir utile aux autres plus tard.




Related