web-dev-qa-db-fra.com

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

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

Pourquoi suis-je toujours en recevant l'erreur -34018 lors de l'appel de la fonction SecItemAdd 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 this 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'élément est ajouté au trousseau.

Résultats actuels

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

Version

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

Configuration

Toujours dans Xcode 8 depuis la version bêta 2 lors des tests dans un simulateur iOS 10.

Ne se produit pas dans Xcode 8 lors des tests 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 diffère du post suivant car il se produit de manière cohérente dans Xcode 8. SecItemAdd et SecItemCopyMatching renvoie le code d'erreur -34018 (errSecMissingEntitlement)

101
Evgenii

J'ai pu contourner ce problème dans mon application en ajoutant Groupes d'accès au troussea au fichier Droits. J'ai activé le partage du trousseau dans la section Capabilities de votre test. application, et cela fonctionne pour moi aussi.

Screenshot of turning on the switch

É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 fonctionne pour vous avec 10.11.5.

182
Deyton

Dans Notes de publication de Xcode 8.1 GM 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 identificateur 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. Xcode insérera alors automatiquement un droit d’identificateur d’application lors de la construction.

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, vous devez simplement l'ajouter à vos variables d'environnement, dans votre schéma.

enter image description here

Xcode 8.2 va résoudre ceci:

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

17
Tiago Almeida

Cela peut se produire si vous avez une cible de test sans application hôte. Pour réparer

  1. ajoutez une application hôte factice: enter image description here

  2. Activer la signature automatique du code et ajouter une équipe:

enter image description here

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

enter image description here

10
Mustafa

Une erreur s'est produite lors de la signature avec un courrier électronique, lors de la création d'un nouvel utilisateur ou lors de la déconnexion à l'aide de firebase.

L'erreur était:

code d'erreur de domaine 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.

5
kavita patel

Je recherchais 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 Il semble que EvergreenCoder ait une bonne solution que son champ d'application ne peut porter que sur le simulateur iOS 10 (car il semble que ce soit le seul simulateur affecté). De la poste:

Le problème semble être qu'il doit y avoir au moins un droit pour que Xcode ajoute correctement l'enttilement "identificateur d'application" à l'application générée. 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 .plist comme ceci:

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

et fournir 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 la publication, ce droit autorise uniquement la connexion du débogueur.

4
ahtierney

J'ai eu un problème similaire, bien que j'obtienne l'erreur -34018 en essayant de fonctionner sur le périphérique. J'utilise XCode 8.1 sur Sierra avec iOS 10.1. Je travaille en équipe et ce problème est soudainement survenu lorsque nous sommes passés à "Gérer automatiquement la signature" dans les paramètres du projet. Lorsque j'éteins et sélectionne manuellement mon profil, tout fonctionne correctement. J'ai finalement dû supprimer mon certificat de développeur de mon trousseau, puis re-sélectionner "Gérer automatiquement la signature". Lors de la prochaine construction, un nouveau certificat de signature a été généré pour moi et tout fonctionne correctement maintenant. Je ne suis toujours pas sûr de la cause du 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 vous aidera à arrêter quelques heures de maux de tête pour quelqu'un d'autre.

1
johnrechd

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

0
Vid