SecItemAdd renvoie toujours l'erreur -34018 dans Xcode 8 dans le simulateur iOS 10

103

Mise à jour : ce problème a été résolu dans Xcode 8.2. Le trousseau fonctionne dans le simulateur sans activer le partage de trousseau.

Pourquoi est-ce que je reçois toujours l' erreur -34018 lors de l'appel de la SecItemAddfonction dans le simulateur Xcode 8 / iOS 10 ?

Étapes à suivre pour reproduire

Créez un nouveau projet d'application iOS à page unique dans Xcode 8. Exécutez le code suivant dans viewDidLoad(ou ouvrez ce projet Xcode).

let itemKey = "My key"
let itemValue = "My secretive bee 🐝"

// Remove from Keychain
// ----------------

let queryDelete: [String: AnyObject] = [
  kSecClass as String: kSecClassGenericPassword,
  kSecAttrAccount as String: itemKey as AnyObject
]

let resultCodeDelete = SecItemDelete(queryDelete as CFDictionary)

if resultCodeDelete != noErr {
  print("Error deleting from Keychain: \(resultCodeDelete)")
}


// Add to keychain
// ----------------

guard let valueData = itemValue.data(using: String.Encoding.utf8) else {
  print("🐣🐣🐣🐣🐣🐣🐣🐣🐣🐣 Error saving text to Keychain")
  return
}

let queryAdd: [String: AnyObject] = [
  kSecClass as String: kSecClassGenericPassword,
  kSecAttrAccount as String: itemKey as AnyObject,
  kSecValueData as String: valueData as AnyObject,
  kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked
]

let resultCode = SecItemAdd(queryAdd as CFDictionary, nil)

if resultCode != noErr {
  print("🐝🐝🐝🐝🐝🐝🐝🐝🐝 Error saving to Keychain: \(resultCode).")
} else {
  print("🍀🍀🍀🍀🍀🍀🍀🍀🍀 Saved to keychain successfully.")
}

Résultats attendus

L'article est ajouté au trousseau.

Résultats actuels

Fonction SecItemAdd renvoie le code d'erreur suivant: -34018.

Version

Xcode version 8.1 (8B62), macOS Sierra 10.12.1.

Configuration

Se produit toujours dans Xcode 8 depuis la bêta 2 lors des tests dans un simulateur iOS 10.

Ne se produit PAS dans Xcode 8 lors du test dans un simulateur iOS 9.3.

Démo

https://dl.dropboxusercontent.com/u/11143285/2016/07/KeychainBugDemo.zip

Références

Radar: https://openradar.appspot.com/27422249

Forums des développeurs Apple: https://forums.developer.apple.com/message/179846

Ce problème est différent de l'article suivant car il se produit systématiquement dans Xcode 8. SecItemAdd et SecItemCopyMatching renvoie le code d'erreur -34018 (errSecMissingEntitlement)

Evgenii
la source
8
Cela semble toujours être un problème dans Xcode 8 GM. Ravi de voir qu'Apple est toujours au sommet de sa forme ...
Nicholas Harlen
1
même pour moi, toujours cette erreur
Kostiantyn Koval
Je creuse vraiment les logs de votre console :-)
Nicolas Miari
Le problème a été résolu dans Xcode 8.2 mais il est de retour dans Xcode 9.0!
Adil Hussain du

Réponses:

183

J'ai pu contourner ce problème dans mon application en ajoutant des groupes d'accès au trousseau au fichier des droits. J'ai activé le commutateur de partage de trousseau dans la section Capacités de votre application de test, et cela fonctionne également pour moi.

Capture d'écran de l'activation de l'interrupteur

Élément à ajouter aux droits:

<key>keychain-access-groups</key>
<array>
    <string>$(AppIdentifierPrefix)com.evgenii.KeychainBugDemo</string>
</array>

Je n'ai essayé cela que sur macOS Sierra (10.12), donc je ne suis pas sûr que cela fonctionnera pour vous sur 10.11.5.

Deyton
la source
Pareil ici, seulement que j'utilise Xcode 8 beta 5 actuellement (avec le simulateur iOS 10. Le problème ne s'est pas présenté avec la version beta précédente. Cela ne se produit pas non plus lors des tests avec 8b5 sur un vrai iPhone iOS 9). J'ai remarqué que les notifications push dans Capabilities devaient être corrigées (c'est-à-dire en appuyant sur le bouton) et j'ai également activé le partage de trousseau, malheureusement en même temps. Ensuite, l'application n'a plus obtenu l'erreur. Après avoir désactivé à nouveau le partage de trousseau, cela fonctionne toujours!
Stefan
2
J'utilise le trousseau comme cible de test et il échoue - comment contourner ce problème? (Puisqu'il n'y a pas de capacités dans les cibles de test)
Sam Jarman
1
@SamJarman J'ai aussi eu ce problème. Je viens d'entrer dans les paramètres de construction pour la cible de test et dé-définir le champ des droits. A bien fonctionné après cela.
Jordan Bondo
3
Cette solution fonctionne bien pour les cibles d'application. Malheureusement, je travaille sur un framework Swift qui utilise KeychainSwift qui ne se construit plus à cause de l'erreur. Dans une cible de framework, je ne peux pas ajouter un fichier de droits afaik. Quelqu'un connaît-il une solution de contournement pour ce cas?
Jan Nash le
5
@JanNash, voici comment j'ai réussi à faire fonctionner les tests evgenii.com/blog/testing-a-keychain-library-in-xcode
Evgenii
17

Dans Xcode 8.1 GM Release Notes, Apple a reconnu le problème et suggéré une solution de contournement plus propre:

Les API de trousseau peuvent ne pas fonctionner dans le simulateur si votre fichier de droits ne contient pas de valeur pour le droit d'identifiant d'application. (28338972) Solution de contournement: ajoutez un paramètre de construction défini par l'utilisateur à votre cible nommée ENTITLEMENTS_REQUIRED et définissez la valeur sur YES. Cela obligera Xcode à insérer automatiquement un droit d'identifiant d'application lors de la création.

Notez que d'après ce que j'ai essayé, cela ne fonctionne que dans Xcode 8.1. Bien que le texte puisse vous induire en erreur dans un paramètre de construction, ce que vous devez faire est de l'ajouter à vos variables d'environnement, dans votre schéma.

entrez la description de l'image ici

Xcode 8.2 résoudra ceci:

Résolu dans Xcode 8.2 beta - Les API IDE Keychain fonctionnent correctement dans Simulator. (28338972)

Tiago Almeida
la source
1
@Tiago Cette solution de contournement des notes de publication fonctionne-t-elle toujours pour vous dans Xcode 8.1 sur le simulateur iOS 10.1? J'ai essayé d'ajouter ce paramètre (à la fois en tant que paramètre défini par l'utilisateur sur la cible et en tant que variable d'environnement dans le schéma), et j'obtiens toujours la valeur de retour -34018 lors de l'exécution sur les simulateurs iOS 10.1.
guywithmazda
3
@guywithmazda, même chose ici. Toujours obtenir -34018 et essayé à la fois les paramètres de construction et les variables d'environnement.
keithbhunter
Cela ne fonctionne pas pour moi, ni dans les paramètres de construction ni en tant que variable d'environnement d'un schéma dans Xcode 8.1 (8B62) sur Sierra. Est-ce que je manque quelque chose?
Evgenii
4
J'utilise Xcode 8.2.1 et ce problème est toujours reproductible. De plus, ma question est si je n'ai pas d'application hôte et que je crée la cible Framework, comment résoudre ce problème?
DShah
2
Ce problème affecte toujours les tests unitaires pour les cibles Framework car dans ce cas, ce serait le stub d'hôte de test qui a besoin des droits. Nous sommes conscients du problème, mais s'il s'agit d'un bloqueur pour vous, veuillez déposer un bogue en double.
russbishop
10

Cela peut se produire si vous avez une cible de test qui n'a pas d'application hôte. Réparer

  1. ajoutez une application hôte factice: entrez la description de l'image ici

  2. Activez la signature automatique du code et ajoutez une équipe:

entrez la description de l'image ici

  1. Activer le partage de trousseau dans les fonctionnalités

entrez la description de l'image ici

Mustafa
la source
5

J'ai rencontré une erreur lors de la signature par e-mail, de la création d'un nouvel utilisateur ou de la déconnexion à l'aide de Firebase.

L'erreur était:

code de domaine d'erreur firauth 17995

J'ai activé le commutateur de partage de trousseau dans la section Capacités de votre application de test, et cela fonctionne également pour moi.

kavita patel
la source
4

Je cherchais une solution qui n'utilisait pas le partage de trousseau, car ce n'était pas la fonctionnalité que je recherchais. Le forum des développeurs semble avoir un bon travail autour d'EvergreenCoder que vous pouvez limiter au seul simulateur iOS 10 (car cela semble être le seul simulateur affecté). D'après le message:

Le problème semble être qu'il doit y avoir au moins un droit pour que Xcode ajoute correctement l'utilité «identificateur d'application» à l'application construite. C'est pourquoi le partage de trousseau semble être une solution, mais ce n'est qu'indirectement: tout autre droit semble fonctionner correctement.

Vous pouvez créer un .plistlike ainsi:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE plist PUBLIC "-/  
<plist version="1.0">  
    <dict>  
        <key>get-task-allow</key>  
        <true/>  
    </dict>  
</plist>

et indiquez un chemin d'accès à ce fichier sous Paramètres de construction dans

Code Signing->Debug->Simulater iOS 10 SDK->($SRCROOT)/your-path-to-file

Comme indiqué dans l'article, ce droit permet simplement au débogueur d'être attaché.

Ahtierney
la source
1

J'ai eu un problème similaire, même si j'obtenais l'erreur -34018 en essayant de fonctionner sur l'appareil. J'utilise XCode 8.1 sur Sierra avec iOS 10.1. Je travaille dans une équipe et j'ai soudainement eu ce problème lorsque nous sommes passés à "Gérer automatiquement la signature" dans les paramètres du projet. Lorsque je désactive cette option et que je sélectionne manuellement mon profil, tout fonctionne correctement. J'ai fini par devoir supprimer mon certificat de développeur de mon trousseau, puis re-sélectionner «Gérer automatiquement la signature». Sur la prochaine version, il a généré un nouveau certificat de signature pour moi et tout fonctionne bien maintenant. Je ne sais toujours pas ce qui a causé le problème car l'autre certificat fonctionnait bien lorsqu'il était sélectionné manuellement, mais pas lorsqu'il était géré par XCode. J'espère que cela aidera à arrêter un mal de tête d'une heure pour quelqu'un d'autre.

johnrechd
la source
1

J'ai pu résoudre ce problème dans Xcode 11 sans aucun ajustement des droits.

J'ai simplement ajouté une nouvelle cible d'application au projet de mon framework appelé MyFrameworkTestsHostApp.

Ensuite, j'ai sélectionné la cible MyFrameworkTests et choisi son application hôte comme MyFrameworkTestsHostApp.

Adam Johns
la source
0

Cela fonctionne après avoir activé le partage du trousseau dans les capacités.

Vid
la source
0

Il y a 3 étapes à suivre pour résoudre ce problème rapidement.

  1. Activez le partage de trousseau dans les fonctionnalités de votre projet.
  2. Sélectionnez l'approvisionnement automatique avec un profil
  3. Assurez-vous que votre option de droit personnalisé est définie sur Entitlement.plist.

Cela fera la magie

Uchenna Nnodim
la source