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

103

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

Warum erhalte ich beim Aufrufen der Funktion im Xcode 8 / iOS 10-Simulator immer den Fehler -34018 ?SecItemAdd

Schritte zum Reproduzieren

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

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

Artikel wird 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 NICHT in Xcode 8 auf, wenn in einem iOS 9.3-Simulator getestet wird.

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 von dem folgenden Beitrag , weil es tritt konsequent in Xcode 8. SecItemAdd und SecItemCopyMatching gibt Fehlercode -34018 (errSecMissingEntitlement)

Evgenii
quelle
8
Dies scheint immer noch ein Problem in Xcode 8 GM zu sein. Schön zu sehen, dass Apple immer noch ganz oben auf dem Spiel steht ...
Nicholas Harlen
1
das gleiche für mich, immer noch dieser Fehler
Kostiantyn Koval
Ich grabe wirklich Ihre Konsolenprotokolle :-)
Nicolas Miari
Das Problem wurde in Xcode 8.2 behoben, aber es ist wieder in Xcode 9.0!
Adil Hussain

Antworten:

183

Ich konnte dies in meiner App umgehen, indem ich der Berechtigungsdatei Schlüsselbundzugriffsgruppen hinzufügte . Ich drehte ich auf dem Schlüsselanhänger - Sharing - Schalter in dem Capabilities Abschnitt in Ihrem Test - App, und es ist auch für mich arbeiten.

Screenshot des Einschaltens des Schalters

Element, das zu Berechtigungen hinzugefügt werden soll:

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

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

Deyton
quelle
Gleiches gilt hier nur, dass ich derzeit Xcode 8 Beta 5 verwende (mit iOS 10-Simulator. Das Problem ist bei der vorherigen Beta nicht aufgetreten. Tritt auch beim Testen mit 8b5 auf einem echten iOS 9 iPhone nicht auf). Ich bemerkte, dass die Push-Benachrichtigungen in den Funktionen repariert werden mussten (dh die Taste drücken mussten) und schaltete leider gleichzeitig die Schlüsselbundfreigabe ein. Dann hat die App den Fehler nicht mehr bekommen. Nach dem Einschalten off wieder Keychain Teile, es funktioniert immer noch!
Stefan
2
Ich benutze den Schlüsselbund als Testziel und es schlägt fehl - wie würde ich das umgehen? (Da es keine Fähigkeiten in Testzielen gibt)
Sam Jarman
1
@ SamJarman Ich hatte auch dieses Problem. Ich bin gerade in die Build-Einstellungen für das Testziel gegangen und habe das Feld Berechtigungen deaktiviert. Hat danach gut funktioniert.
Jordan Bondo
3
Diese Lösung eignet sich gut für App-Ziele. Leider arbeite ich an einem Swift-Framework, das KeychainSwift verwendet und aufgrund des Fehlers nicht mehr erstellt wird. In einem Framework-Ziel kann ich keine Berechtigungsdatei afaik hinzufügen. Kennt jemand eine Problemumgehung für diesen Fall?
Jan Nash
5
@ JanNash, hier ist, wie ich es geschafft habe, dass die Tests funktionieren evgenii.com/blog/testing-a-keychain-library-in-xcode
Evgenii
17

In den Versionshinweisen zu Xcode 8.1 GM hat Apple das Problem erkannt und eine sauberere Problemumgehung vorgeschlagen:

Schlüsselbund-APIs funktionieren möglicherweise nicht im Simulator, wenn Ihre Berechtigungsdatei keinen Wert für die Berechtigung zur Anwendungskennung enthält. (28338972) Problemumgehung: Fügen Sie Ihrem Ziel eine benutzerdefinierte Build-Einstellung mit dem Namen ENTITLEMENTS_REQUIRED hinzu und setzen Sie den Wert auf YES. Dies führt dazu, dass Xcode beim Erstellen automatisch eine Berechtigung zur Anwendungskennung 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 irreführen kann, müssen Sie dies in Ihrem Schema zu Ihren Umgebungsvariablen hinzufügen.

Geben Sie hier die Bildbeschreibung ein

Xcode 8.2 wird dies lösen:

In Xcode 8.2 Beta behoben - IDE-Schlüsselbund-APIs funktionieren in Simulator ordnungsgemäß. (28338972)

Tiago Almeida
quelle
1
@Tiago Funktioniert diese Problemumgehung aus den Versionshinweisen in Xcode 8.1 auf dem iOS 10.1-Simulator noch für Sie? Ich habe versucht, diese Einstellung hinzuzufügen (sowohl als benutzerdefinierte Einstellung für das Ziel als auch als Umgebungsvariable im Schema), und ich erhalte immer noch den Rückgabewert -34018, wenn ich auf den iOS 10.1-Simulatoren ausgeführt werde.
guywithmazda
3
@guywithmazda, gleich hier. Immer noch -34018 und versuchte sowohl Build-Einstellungen als auch Umgebungsvariablen.
Keithbhunter
Funktioniert für mich weder in Build-Einstellungen noch als Umgebungsvariable eines Schemas in Xcode 8.1 (8B62) in Sierra. Vermisse ich etwas
Evgenii
4
Ich verwende Xcode 8.2.1 und dieses Problem ist immer noch reproduzierbar. Meine Frage lautet außerdem: Wenn ich keine Host-App habe und das Framework-Ziel erstelle, wie kann dieses Problem behoben werden?
DShah
2
Dieses Problem betrifft weiterhin Komponententests für Framework-Ziele, da in diesem Fall der Testhost-Stub Berechtigungen benötigt. Wir sind uns des Problems bewusst, aber wenn es ein Blocker für Sie ist, melden Sie bitte einen doppelten Fehler.
russbishop
10

Dies kann passieren, wenn Sie ein Testziel haben, das keine Host-App hat. Reparieren

  1. Fügen Sie eine Dummy-Host-App hinzu: Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

  1. Aktivieren Sie die Schlüsselbundfreigabe in Funktionen

Geben Sie hier die Bildbeschreibung ein

Mustafa
quelle
5

Beim Signieren mit E-Mail, Erstellen eines neuen Benutzers oder beim Abmelden mit Firebase ist eine Fehlermeldung aufgetreten.

Der Fehler war:

Firauth-Fehlerdomänencode 17995

Ich habe den Schlüsselbund-Freigabeschalter im Abschnitt "Funktionen" in Ihrer Test-App aktiviert und er funktioniert auch für mich.

Kavita Patel
quelle
4

Ich suchte nach einer Lösung, bei der die Schlüsselbundfreigabe nicht verwendet wurde, da dies nicht die Funktion war, nach der ich gesucht hatte. Das Entwicklerforum scheint eine gute Lösung von EvergreenCoder zu haben, deren Umfang Sie nur auf den iOS 10-Simulator beschränken können (da dies der einzige betroffene Simulator zu sein scheint). Aus der Post:

Das Problem scheint zu sein, dass es mindestens eine Berechtigung geben muss, damit Xcode der erstellten Anwendung die Enttilement "Anwendungskennung" ordnungsgemäß hinzufügen kann. Aus diesem Grund scheint das Teilen von Schlüsselbunden eine Lösung zu sein, aber dies ist nur indirekt der Fall: Jede andere Berechtigung scheint gut zu funktionieren.

Sie können so etwas erstellen .plist:

<?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-Einstellungen 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, ermöglicht diese Berechtigung lediglich das Anhängen des Debuggers.

Ahtierney
quelle
1

Ich hatte ein ähnliches Problem, obwohl beim Versuch, auf dem Gerät ausgeführt zu werden, der Fehler -34018 angezeigt wurde. 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 ausschalte und mein Profil manuell auswähle, funktioniert alles einwandfrei. Am Ende 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 für mich generiert, und jetzt funktioniert alles einwandfrei. Ich bin mir immer noch nicht sicher, was das Problem verursacht hat, da das andere Zertifikat bei manueller Auswahl einwandfrei funktioniert hat, aber nicht, wenn es von XCode verwaltet wird. Hoffe, dies hilft, stundenlange Kopfschmerzen für jemand anderen zu stoppen.

Johnrechd
quelle
1

Ich konnte dieses Problem in Xcode 11 ohne Berechtigungsanpassungen lösen.

Ich habe dem Projekt meines Frameworks einfach ein neues App-Ziel namens MyFrameworkTestsHostApp hinzugefügt.

Dann habe ich das MyFrameworkTests-Ziel ausgewählt und seine Host-Anwendung als MyFrameworkTestsHostApp ausgewählt.

Adam Johns
quelle
0

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

Vid
quelle
0

Es sind 3 Schritte erforderlich, um dieses Problem schnell zu beheben.

  1. Aktivieren Sie die Schlüsselbundfreigabe in Ihren Projektfunktionen.
  2. Wählen Sie Automatische Bereitstellung mit einem Profil
  3. Stellen Sie sicher, dass Ihre benutzerdefinierte Berechtigungsoption auf Entitlement.plist festgelegt ist.

Dies wird die Magie tun

Uchenna Nnodim
quelle