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 ?
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.")
}
L'élément est ajouté au trousseau.
La fonction SecItemAdd renvoie le code d'erreur suivant: -34018
.
Xcode version 8.1 (8B62), macOS Sierra 10.12.1.
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.
https://dl.dropboxusercontent.com/u/11143285/2016/07/KeychainBugDemo.Zip
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)
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.
É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.
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.
Xcode 8.2 va résoudre ceci:
Résolu dans Xcode 8.2 beta - IDE Les API de trousseau fonctionnent correctement dans Simulator. (28338972)
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.
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.
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.
Cela fonctionne après avoir activé le partage de trousseau dans les capacités.