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



xcode 8.2 1 (6)

J'ai pu contourner ce problème dans mon application en ajoutant des groupes d'accès au trousseau au fichier 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.

É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.

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 est-ce que je reçois toujours l' erreur -34018 lorsque SecItemAdd 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 de tests dans un simulateur iOS 9.3.

Démo

this

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 régulièrement dans Xcode 8. SecItemAdd et SecItemCopyMatching renvoie le code d'erreur -34018 (errSecMissingEntitlement)


Answer #1

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


Answer #2

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 des maux de tête de plusieurs heures pour quelqu'un d'autre.


Answer #3

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

  1. ajoutez une application hôte factice:

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

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


Answer #4

Dans les notes de publication de GM Xcode 8.1, 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 à l'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.

Xcode 8.2 va résoudre ceci:

Résolu dans la version bêta de Xcode 8.2 - Les API de trousseau IDE fonctionnent correctement dans Simulator. (28338972)


Answer #5

Je recherchais une solution qui n'utilisait pas le partage de trousseau, car ce n'était pas la fonctionnalité que je recherchais. https://forums.developer.apple.com/message/179846 semble bien fonctionner avec EvergreenCoder et son étendue peut être limitée au 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.





xcode8