webentwicklung-frage-antwort-db.com.de

SecItemAdd gibt in Xcode 8 im iOS 10-Simulator immer den Fehler -34018 zurück

Update : Dieses Problem wurde in Xcode 8.2 behoben. Schlüsselbund funktioniert im Simulator, ohne die Schlüsselbundfreigabe zu aktivieren.

Warum erhalte ich immer den Fehler -34018 beim Aufruf von SecItemAdd function im Xcode 8/iOS 10-Simulator?

Schritte zum Reproduzieren

Erstellen Sie ein neues einseitiges iOS-App-Projekt in Xcode 8. Führen Sie den folgenden Code in viewDidLoad aus (oder öffnen Sie this Xcode project).

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.")
}

Erwartete Ergebnisse

Der Artikel wurde zum Schlüsselbund hinzugefügt.

Tatsächliche Ergebnisse

Die Funktion SecItemAdd gibt den folgenden Fehlercode zurück: -34018.

Ausführung

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

Aufbau

Tritt in Xcode 8 seit Beta 2 immer auf, wenn in einem iOS 10-Simulator getestet wird.

Tritt in Xcode 8 beim Testen in einem iOS 9.3-Simulator NICHT auf.

Demo

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

Verweise

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

Apple Developer Forums: https://forums.developer.Apple.com/message/179846

Dieses Problem unterscheidet sich vom folgenden Beitrag, da es in Xcode 8 konsistent auftritt. SecItemAdd und SecItemCopyMatching geben den Fehlercode -34018 (errSecMissingEntitlement zurück

101
Evgenii

Ich konnte dies in meiner App umgehen, indem ich Keychain Access Groups zur Entitlements-Datei hinzufügte. Ich habe den Keychain Sharing Schalter im Abschnitt Capabilities in Ihrem Test aktiviert App, und es funktioniert auch für mich.

Screenshot of turning on the switch

Element zum Hinzufügen zu Berechtigungen:

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

Ich habe dies nur unter macOS Sierra (10.12) ausprobiert, daher bin ich mir nicht sicher, ob es unter 10.11.5 für Sie funktionieren wird.

182
Deyton

In Xcode 8.1 GM Versionshinweise Apple bestätigte das Problem und schlug eine sauberere Lösung vor:

Schlüsselbund-APIs funktionieren möglicherweise nicht im Simulator, wenn Ihre Berechtigungsdatei keinen Wert für die Anwendungs-ID-Berechtigung enthält. (28338972) Problemumgehung: Fügen Sie Ihrem Ziel eine benutzerdefinierte Buildeinstellung mit dem Namen ENTITLEMENTS_REQUIRED hinzu und setzen Sie den Wert auf YES. Dies führt dazu, dass Xcode beim Erstellen automatisch eine Anwendungs-ID-Berechtigung einfügt.

Beachten Sie, dass es nach dem, was ich versucht habe, nur in Xcode 8.1 funktioniert. Obwohl der Text Sie in eine Build-Einstellung verführen kann, müssen Sie dies zu Ihren Umgebungsvariablen in Ihrem Schema hinzufügen.

enter image description here

Xcode 8.2 wird dies lösen:

Behoben in Xcode 8.2 Beta - IDE Schlüsselbund-APIs funktionieren in Simulator korrekt. (28338972)

17
Tiago Almeida

Dies kann vorkommen, wenn Sie ein Testziel haben, für das keine Host-App vorhanden ist. Reparieren

  1. füge eine Dummy-Host-App hinzu: enter image description here

  2. Aktivieren Sie die automatische Codesignatur und fügen Sie ein Team hinzu:

enter image description here

  1. Aktivieren Sie die Schlüsselbundfreigabe in Funktionen

enter image description here

10
Mustafa

Beim Signieren per E-Mail, beim Erstellen eines neuen Benutzers oder beim Abmelden mit firebase ist ein Fehler aufgetreten.

Der Fehler war:

firauth error domain code 17995

Ich habe den Keychain Sharing-Schalter im Abschnitt "Funktionen" in Ihrer Test-App aktiviert, und er funktioniert auch bei mir.

5
kavita patel

Ich suchte nach einer Lösung, bei der Keychain Sharing nicht verwendet wurde, da dies nicht die gesuchte Funktion war. Das Entwicklerforum Scheint eine gute Arbeit von EvergreenCoder zu haben, die Sie nur auf den iOS 10-Simulator beschränken können (da dies der einzige betroffene Simulator zu sein scheint). Von der Post:

Das Problem scheint zu sein, dass mindestens eine Berechtigung vorhanden sein muss, damit Xcode der erstellten Anwendung die Berechtigung "Anwendungs-ID" ordnungsgemäß hinzufügt. Aus diesem Grund scheint das Teilen von Schlüsselbunden eine Lösung zu sein, aber es ist nur indirekt so: Jeder andere Anspruch scheint in Ordnung zu sein.

Sie können einen .plist Wie folgt erstellen:

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

und geben Sie unter Build Settings in einen Pfad zu dieser Datei an

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

Wie in der Veröffentlichung angegeben, kann mit dieser Berechtigung nur der Debugger angehängt werden.

4
ahtierney

Ich hatte ein ähnliches Problem, obwohl ich den Fehler -34018 erhalten habe, als ich versuchte, auf dem Gerät zu laufen. Ich verwende XCode 8.1 unter Sierra mit iOS 10.1. Ich arbeite in einem Team und hatte plötzlich dieses Problem, als wir in den Projekteinstellungen auf "Signieren automatisch verwalten" umstellten. Wenn ich dies deaktiviere und mein Profil manuell auswähle, funktioniert alles einwandfrei. Schließlich musste ich mein Entwicklerzertifikat aus meinem Schlüsselbund löschen und dann "Signatur automatisch verwalten" erneut auswählen. Beim nächsten Build wurde ein neues Signaturzertifikat erstellt, und jetzt funktioniert alles einwandfrei. Ich bin immer noch nicht sicher, was das Problem verursacht hat, da das andere Zertifikat bei der manuellen Auswahl einwandfrei funktioniert hat, aber nicht, wenn es von XCode verwaltet wird. Hoffe, dies hilft, stundenlange Kopfschmerzen für jemand anderen zu stoppen.

1
johnrechd

Es funktioniert, nachdem die Schlüsselbundfreigabe in Funktionen aktiviert wurde.

0
Vid