Parfois, lorsque j'exécute une application sur un appareil à partir de Xcode, j'essaie d'accéder au trousseau mais j'échoue en raison de l'erreur -34018. Cela ne correspond à aucun des codes d'erreur du trousseau documentés et ne peut pas être reproduit de manière cohérente. (cela arrive peut-être 30% du temps, et je ne sais pas pourquoi cela se produit). Ce qui rend le débogage de ce problème très difficile, c'est le manque total de documentation. Une idée de ce qui cause cela et comment y remédier? J'utilise Xcode 5 et j'exécute iOS 7.0.4 sur l'appareil.
Il y a un problème ouvert à ce sujet ici: https://github.com/soffes/sskeychain/issues/52
EDIT: Ajout du code d'accès au trousseau par demande
J'utilise la SSKeychain
bibliothèque pour m'interfacer avec le trousseau. Voici l'extrait.
#define SERVICE @"default"
@implementation SSKeychain (EXT)
+ (void)setValue:(NSString *)value forKey:(NSString *)key {
NSError *error = nil;
BOOL success = NO;
if (value) {
success = [self setPassword:value forService:SERVICE account:key error:&error];
} else {
success = [self deletePasswordForService:SERVICE account:key error:&error];
}
NSAssert(success, @"Unable to set keychain value %@ for key %@ error %@", value, key, error);
if (!success) {
LogError(@"Unable to set value to keychain %@", error);
}
LogTrace(@"Will set keychain account %@. is to nil? %d", key, value == nil);
if (value == nil)
LogWarn(@"Setting keychain %@ to nil!!!", key);
}
+ (NSString *)valueForKey:(NSString *)key {
NSError *error = nil;
NSString *value = [self passwordForService:SERVICE account:key error:&error];
if (error && error.code != errSecItemNotFound) {
NSAssert(!error, @"Unable to retrieve keychain value for key %@ error %@", key, error);
LogError(@"Unable to retrieve keychain value for key %@ error %@", key, error);
}
return value;
}
+ (BOOL)removeAllValues {
LogInfo(@"Completely Reseting Keychain");
return [[self accountsForService:SERVICE] all:^BOOL(NSDictionary *accountInfo) {
return [self deletePasswordForService:SERVICE account:accountInfo[@"acct"]];
}];
}
@end
La grande majorité du temps, c'est très bien. Parfois, je rencontre des échecs d'assertion où je suis incapable d'écrire ou de lire à partir du trousseau, provoquant un échec d'assertion critique.
la source
Réponses:
Une réponse ici, d'Apple:
https://forums.developer.apple.com/thread/4743#14441
METTRE À JOUR
https://forums.developer.apple.com/thread/4743#126088
la source
Fondamentalement, vous devez coder votre dossier .xcttest en ajoutant ce qui suit en tant que script d'exécution dans votre cible de test.
J'ai eu beaucoup d'erreurs -34018 lors du test de mon trousseau sur l'appareil et cela a réussi à le réparer.
Si le problème n'existe pas dans votre cible de test, ce n'est probablement pas la solution.
la source
Après avoir inspecté le code source . J'ai remarqué que les fonctionnalités du trousseau sont accessibles via un démon de sécurité qui s'exécute dans son propre processus (séparé du processus d'application).
Votre application et le processus securityd `` parlent '' ensemble grâce à une technologie appelée XPC .
Si nécessaire, securityd est lancé via la célèbre commande launchd de XPC. Vous pouvez probablement vérifier que le démon est en cours d'exécution dans l'application Activity Monitor (s'il est exécuté dans Simulator bien sûr) et que son processus parent est lancé.
Je suppose ici qu'il est possible que, pour une raison inconnue, le démon de sécurité ne démarre pas ou le fasse trop lentement et ne soit pas prêt lorsque vous essayez de l'utiliser.
Vous pourriez peut-être réfléchir à la manière de pré-lancer le démon.
Je m'excuse de ne pas être plus précis. J'espère que cela vous aidera à aller plus loin dans vos enquêtes.
la source
J'observe un comportement similaire après la création et l'exécution de mon code dans Xcode 6 beta avec iOS 8 SDK (il fonctionne correctement avec Xcode 5 / iOS 7). Dans Xcode 6, dans iOS Simulator SecItemCopyMatching renvoie toujours -34018. Il a commencé à fonctionner après avoir activé le «Partage du trousseau» dans l'onglet Capacités.
Cependant, j'ai un autre problème. Je développe une bibliothèque statique, qui est utilisée par (entre autres) l'application de démonstration. La solution ci-dessus fonctionne pour le projet d'application de démonstration, mais lorsque j'essaie de tester unitaire mon projet de bibliothèque statique, j'ai exactement la même erreur. Et le problème est que mon projet de bibliothèque statique n'a pas l'onglet Capabilities (car ce n'est pas l'application autonome).
J'ai essayé la solution publiée ici par JorgeDeCorte, avec la signature de code dans la cible de test, mais cela ne fonctionne pas pour moi.
la source
Essayez de désactiver tous les points d'arrêt lors du lancement de l'application partir de Xcode. Vous pouvez les activer par la suite.
(Aucune des solutions de contournement ci-dessus n'a fonctionné pour moi)
la source
J'ai juste eu le même problème sur le simulateur exécutant 7.1 et 8.0. En creusant, j'ai remarqué que l'exemple d'application Apple avait le partage de KeyChain activé pour ses capacités cibles. Je l'ai activé pour mon application, ce qui a entraîné la création d'un fichier de droits que j'ai laissé avec les valeurs par défaut et maintenant je n'obtiens plus d'erreurs -34018. Ce n'est pas idéal mais je vais vivre l'option de partage KeyChain pour le moment.
la source
La création de codes d'un bundle .xctest n'est pas aussi simple que cela puisse paraître dans certains cas. Principalement JorgeDeCorte a raison avec sa réponse que la ligne courte donnée en tant que
Run Script
est suffisante pour la plupart des développeurs.Mais lorsque vous avez plusieurs certificats dans votre trousseau, cela échouera avec la ligne suivante
Une solution pour obtenir le bon certificat même avec plusieurs certificats est ce court script. Bien sûr, ce n'est pas idéal, mais à ma connaissance, vous n'avez aucune chance d'obtenir le certificat que Xcode a trouvé et utilise pour signer votre .app.
la source
J'ai aussi été mordu par cela et je n'ai eu aucun succès avec aucune des autres solutions de contournement. J'ai ensuite nettoyé mes profils d'approvisionnement sur les appareils eux-mêmes en supprimant tous ceux liés à mon application ainsi que tous les profils génériques (cela semble être le but). Pour ce faire, allez dans la fenêtre "Appareils" dans Xcode et faites un clic droit sur votre téléphone (connecté):
Cliquez sur "Afficher les profils de provisionnement" et supprimez les profils associés, et notamment les profils d'équipe:
y compris ceux avec l'astérisque. Après la réinstallation de l'application, tout est revenu à la normale.
la source
J'ai résolu ce problème (je pense). J'avais un profil de provisionnement générique sur mon appareil qui montrait qu'il n'avait pas d'identité de signature valide. J'avais également un profil d'approvisionnement pour mon application qui était valide. Lorsque j'ai supprimé le profil générique, j'ai cessé de recevoir les erreurs -34018.
Je me suis également assuré que l'identité de signature de code et le profil d'approvisionnement répertoriés dans la section Signature de code des paramètres de construction de la cible étaient identiques à ceux de l'application (pas celui générique "Développeur iPhone")
la source
Je recevais -34018 erreur dans mon application (iOS 8.4) très rarement. Après quelques recherches, j'ai constaté que ce problème se produit lorsque l'application demande trop souvent des données au trousseau .
Par exemple, dans ma situation, il s'agissait de deux demandes de lecture pour une clé spécifique en même temps à partir de différents modules d'application.
Pour résoudre ce problème, je viens d'ajouter la mise en cache de cette valeur en mémoire
la source
J'avais le même problème, à l'improviste, en cours d'exécution sur un appareil de test avec Xcode 6.2, iPhone 6, iOS 8.3. Pour être clair, cela ne s'est pas produit lors de l'exécution des tests Xcode, mais plutôt lors de l'exécution de l'application réelle sur mon appareil. Dans le simulateur, tout allait bien, et fonctionnant sur l'application elle-même, tout allait parfaitement bien jusqu'à récemment.
J'ai essayé toutes les suggestions que j'ai pu trouver ici, telles que la suppression des profils d'approvisionnement sur mon appareil (je les ai tous supprimés), l'activation temporaire de la fonctionnalité de partage de trousseau dans mon projet (même si nous n'en avons pas vraiment besoin), bien sûr que mon compte de développement dans Xcode a été totalement actualisé avec tous les certificats et profils d'approvisionnement, etc. Rien n'a aidé.
Ensuite, j'ai temporairement changé le niveau d'accessibilité de
kSecAttrAccessibleAfterFirstUnlock
àkSecAttrAccessibleAlwaysThisDeviceOnly
, exécuté l'application, et cela a bien fonctionné et j'ai pu écrire sur le trousseau. Ensuite, je l'ai changé à nouveaukSecAttrAccessibleAfterFirstUnlock
et le problème semble avoir disparu «définitivement».la source
Je viens de me faire mordre par ce bogue sur Xcode 8 Beta 3. Activer le partage de trousseau semble être la seule solution.
la source
J'ai eu le même problème. Correction du problème en configurant le partage de trousseau.
la source
(ce n'est pas une réponse directe à la question du PO, mais cela pourrait aider les autres)
Commencé à obtenir l'erreur de trousseau -34018 de manière cohérente dans le simulateur après la mise à jour de Xcode de la version 7.3.1 à 8.0.
Suite à cette astuce de la réponse de daidai ,
il a été découvert que Provisioning Profile avait en quelque sorte été défini sur Aucun dans les sections Signature de la cible.
Cependant, la définition des champs de profil d'approvisionnement sur des valeurs valides n'était pas suffisante pour résoudre le problème dans ce cas.
Une enquête plus approfondie a montré que le droit aux notifications push affichait également une erreur. Il disait "Ajouter la fonction de notifications push à votre identifiant d'application". l'étape a été terminée, mais l'étape «Ajouter le droit de notifications push à votre fichier de droits» ne l'était pas.
Après avoir appuyé sur «Corriger le problème» pour résoudre le problème de notification push, l'erreur de trousseau a été résolue.
Pour cette cible particulière, le droit «Partage de trousseau» avait déjà été activé à un moment donné. La désactivation n'a pas fait réapparaître l'erreur du trousseau jusqu'à présent, il n'est donc pas clair si cela est nécessaire dans ce cas.
la source
Dans iOS 9, j'ai désactivé Address Sanitizer et il a commencé à fonctionner sur l'appareil.
la source
La seule solution qui a fonctionné pour moi a d'abord été de stocker nil pour la clé spécifiée, puis de stocker ma nouvelle valeur avec une opération distincte. Il échouerait en raison de l'erreur -34018 si j'essayais d'écraser la valeur existante. Mais tant que je stockais nil en premier, la valeur mise à jour serait stockée avec succès immédiatement après.
la source
J'ai rencontré ce problème -34018 aujourd'hui lors de l'exécution de l'API SecItemDelete. Ce que j'ai fait pour résoudre ce problème est: 1. Suite à la solution @ k1th https://stackoverflow.com/a/33085955/889892 2. Exécutez SecItemDelete dans le thread principal (auparavant, il est lu à partir du thread principal, alors alignez-le simplement avec la suppression) .
Désolé, il revient :(
la source
Activez le partage de trousseau dans les capacités de votre projet, cela devrait résoudre le problème.
la source
Ce qui a fonctionné pour moi
la source
Pour moi, c'était un problème de signature d'application. Je suis simplement passé à la bonne équipe de signature dans Xcode et l'erreur ne s'est plus produite
la source