Wenn ich eine Anwendung auf einem Gerät über Xcode ausführe, versuche ich manchmal, auf den Schlüsselbund zuzugreifen, was jedoch aufgrund des Fehlers -34018 fehlschlägt. Dies stimmt mit keinem der dokumentierten Schlüsselbund-Fehlercodes überein und kann nicht konsistent reproduziert werden. (passiert vielleicht 30% der Zeit und mir ist nicht klar, warum es passiert). Was das Debuggen dieses Problems sehr schwierig macht, ist der völlige Mangel an Dokumentation. Irgendeine Idee, was dies verursacht und wie man es behebt? Ich verwende Xcode 5 und verwende iOS 7.0.4 auf dem Gerät.
Hier gibt es ein offenes Problem: https://github.com/soffes/sskeychain/issues/52
BEARBEITEN: Hinzufügen eines Schlüsselbund-Zugangscodes pro Anfrage
Ich benutze die SSKeychain
Bibliothek für die Schnittstelle mit Schlüsselbund. Hier ist der Ausschnitt.
#define SERVICE @"default"
@implementation SSKeychain (EXT)
+ (void)setValue:(NSString *)value forKey:(NSString *)key {
NSError *error = nil;
BOOL success = NO;
if (value) {
success = [self setPassword:value forService:SERVICE account:key error:&error];
} else {
success = [self deletePasswordForService:SERVICE account:key error:&error];
}
NSAssert(success, @"Unable to set keychain value %@ for key %@ error %@", value, key, error);
if (!success) {
LogError(@"Unable to set value to keychain %@", error);
}
LogTrace(@"Will set keychain account %@. is to nil? %d", key, value == nil);
if (value == nil)
LogWarn(@"Setting keychain %@ to nil!!!", key);
}
+ (NSString *)valueForKey:(NSString *)key {
NSError *error = nil;
NSString *value = [self passwordForService:SERVICE account:key error:&error];
if (error && error.code != errSecItemNotFound) {
NSAssert(!error, @"Unable to retrieve keychain value for key %@ error %@", key, error);
LogError(@"Unable to retrieve keychain value for key %@ error %@", key, error);
}
return value;
}
+ (BOOL)removeAllValues {
LogInfo(@"Completely Reseting Keychain");
return [[self accountsForService:SERVICE] all:^BOOL(NSDictionary *accountInfo) {
return [self deletePasswordForService:SERVICE account:accountInfo[@"acct"]];
}];
}
@end
Die meiste Zeit ist es in Ordnung. Manchmal stoße ich auf Assertionsfehler, bei denen ich weder in den Schlüsselbund schreiben noch aus diesem lesen kann, was zu einem kritischen Assertionsfehler führt.
quelle
Antworten:
Eine Antwort hier von Apple:
https://forums.developer.apple.com/thread/4743#14441
AKTUALISIEREN
https://forums.developer.apple.com/thread/4743#126088
quelle
Grundsätzlich müssen Sie Ihren .xcttest-Ordner mit einem Codesign versehen, indem Sie Folgendes als Ausführungsskript in Ihr Testziel einfügen.
Beim Testen meines Schlüsselbunds auf dem Gerät sind viele -34018-Fehler aufgetreten, die behoben werden konnten.
Wenn das Problem in Ihrem Testziel nicht vorhanden ist, ist dies wahrscheinlich nicht die Lösung.
quelle
Nach der Überprüfung des Quellcodes . Ich habe festgestellt, dass auf die Schlüsselbundfunktionen über einen Sicherheitsdämon zugegriffen wird, der in einem eigenen Prozess ausgeführt wird (vom App-Prozess getrennt).
Ihre App und der Sicherheitsprozess "sprechen" über eine Technologie namens XPC miteinander .
Bei Bedarf wird securityd über den bekannten Befehl launchd von XPC gestartet. Sie können wahrscheinlich überprüfen, ob der Dämon in der Activity Monitor-App ausgeführt wird (wenn er natürlich in Simulator ausgeführt wird) und ob der übergeordnete Prozess gestartet wird.
Ich vermute hier, dass es möglich ist, dass der Sicherheitsdämon aus einem unbekannten Grund nicht oder zu langsam gestartet wird und nicht bereit ist, wenn Sie versuchen, ihn zu verwenden.
Vielleicht könnten Sie darüber nachdenken, wie Sie den Daemon vorab starten können.
Ich entschuldige mich dafür, dass ich nicht genauer bin. Ich hoffe, es könnte Ihnen helfen, bei Ihren Ermittlungen noch einen Schritt weiter zu gehen.
quelle
Ich beobachte ein ähnliches Verhalten, nachdem ich meinen Code in Xcode 6 Beta mit iOS 8 SDK erstellt und ausgeführt habe (es funktioniert ordnungsgemäß mit Xcode 5 / iOS 7). In Xcode 6 gibt SecItemCopyMatching in iOS Simulator immer -34018 zurück. Es begann zu funktionieren, nachdem die Option "Schlüsselbundfreigabe" auf der Registerkarte "Funktionen" aktiviert wurde.
Ich habe jedoch ein anderes Problem. Ich entwickle eine statische Bibliothek, die (unter anderem) von der Demo-Anwendung verwendet wird. Die obige Lösung funktioniert für Demo-Anwendungsprojekte, aber wenn ich versuche, mein statisches Bibliotheksprojekt einem Komponententest zu unterziehen, tritt genau der gleiche Fehler auf. Das Problem ist, dass mein statisches Bibliotheksprojekt nicht über die Registerkarte Funktionen verfügt (da es sich nicht um eine eigenständige Anwendung handelt).
Ich habe die hier von JorgeDeCorte veröffentlichte Lösung mit Codesignierung im Testziel ausprobiert, aber sie funktioniert bei mir nicht.
quelle
Versuchen Sie alle Haltepunkte zu deaktivieren , wenn Sie die App starten von Xcode. Sie können sie anschließend aktivieren.
(Keine der oben genannten Problemumgehungen hat bei mir funktioniert)
quelle
Ich hatte gerade das gleiche Problem auf dem Simulator mit 7.1 und 8.0. Beim Graben stellte ich fest, dass in der Apple-Beispiel-App KeyChain Sharing für die Zielfunktionen aktiviert war. Ich habe es für meine App aktiviert, was dazu führte, dass eine Berechtigungsdatei erstellt wurde, die ich mit den Standardwerten belassen habe. Jetzt werden keine -34018-Fehler mehr angezeigt. Dies ist nicht ideal, aber ich werde die KeyChain-Freigabeoption vorerst leben.
quelle
Das Codesignieren eines .xctest-Bundles ist in einigen Fällen nicht so einfach, wie es sich anhört. Grundsätzlich hat JorgeDeCorte mit seiner Antwort Recht , dass die angegebene kurze Zeile als a
Run Script
für die meisten Entwickler ausreicht.Wenn Sie jedoch mehrere Zertifikate in Ihrem Schlüsselbund haben, schlägt dies in der folgenden Zeile fehl
Eine Lösung, um auch bei mehreren das richtige Zertifikat zu erhalten, ist dieses kurze Skript. Dies ist zwar nicht ideal, aber meines Wissens haben Sie keine Chance, das Zertifikat zu erhalten, das Xcode gefunden und zum Signieren Ihrer .app verwendet hat.
quelle
Ich wurde auch davon gebissen und hatte mit keiner der anderen Problemumgehungen Erfolg. Ich habe dann meine Bereitstellungsprofile auf den Geräten selbst bereinigt, indem ich alle mit meiner App verbundenen Profile sowie alle Platzhalterprofile gelöscht habe (dies scheint der Punkt zu sein). Gehen Sie dazu in Xcode zum Fenster "Geräte" und klicken Sie mit der rechten Maustaste auf Ihr (verbundenes) Telefon:
Klicken Sie auf "Bereitstellungsprofile anzeigen" und löschen Sie die zugehörigen Profile, insbesondere die Teamprofile:
einschließlich der mit dem Sternchen. Nach der Neuinstallation der App wurde alles wieder normal.
quelle
Ich habe dieses Problem behoben (glaube ich). Ich hatte ein Wildcard-Bereitstellungsprofil auf meinem Gerät, das zeigte, dass es keine gültige Signaturidentität hatte. Ich hatte auch ein Bereitstellungsprofil für meine App, das gültig war. Als ich das Platzhalterprofil löschte, wurden die Fehler -34018 nicht mehr angezeigt.
Ich habe auch sichergestellt, dass die Codesignaturidentität und das Bereitstellungsprofil, die im Abschnitt Codesignatur der Build-Einstellungen des Ziels aufgeführt sind, mit denen für die App identisch sind (nicht mit dem generischen "iPhone Developer").
quelle
Ich habe sehr selten einen Fehler von -34018 in meiner App (iOS 8.4) erhalten. Nach einigen Nachforschungen habe ich festgestellt, dass dieses Problem auftritt, wenn die App zu oft Daten vom Schlüsselbund anfordert .
In meiner Situation waren es beispielsweise zwei Leseanforderungen für einen bestimmten Schlüssel gleichzeitig von verschiedenen Anwendungsmodulen.
Um dies zu beheben, habe ich gerade das Zwischenspeichern dieses Werts im Speicher hinzugefügt
quelle
Ich hatte aus heiterem Himmel das gleiche Problem auf einem Testgerät mit Xcode 6.2, iPhone 6, iOS 8.3. Dies wurde nicht beim Ausführen von Xcode-Tests, sondern beim Ausführen der eigentlichen App auf meinem Gerät festgestellt. Im Simulator war es in Ordnung, und auf der App selbst war es bis vor kurzem vollkommen in Ordnung.
Ich habe alle Vorschläge ausprobiert, die ich hier finden konnte, z. B. das Entfernen der Bereitstellungsprofile auf meinem Gerät (ich habe ALLE entfernt) und vorübergehend die Funktion zur Schlüsselbundfreigabe in meinem Projekt aktiviert (obwohl wir das nicht wirklich benötigen) Sicher, mein Entwicklungskonto in Xcode wurde mit allen Zertifikaten und Bereitstellungsprofilen usw. vollständig aktualisiert. Nichts hat geholfen.
Dann habe ich vorübergehend die Eingabehilfenstufe von
kSecAttrAccessibleAfterFirstUnlock
auf geändertkSecAttrAccessibleAlwaysThisDeviceOnly
, die App ausgeführt, sie hat einwandfrei funktioniert und konnte in den Schlüsselbund schreiben. Dann habe ich es wieder geändertkSecAttrAccessibleAfterFirstUnlock
und das Problem scheint "dauerhaft" verschwunden zu sein.quelle
Ich bin gerade von diesem Fehler in Xcode 8 Beta 3 gebissen worden. Das Aktivieren der Schlüsselbundfreigabe scheint die einzige Lösung zu sein.
quelle
Ich hatte das gleiche Problem. Es wurde behoben, indem die Schlüsselbundfreigabe eingerichtet wurde.
quelle
(Dies ist keine direkte Antwort auf die Frage des OP, könnte aber anderen helfen.)
Nach dem Aktualisieren von Xcode von Version 7.3.1 auf 8.0 wurde der Schlüsselbundfehler -34018 im Simulator konsistent angezeigt.
Nach diesem Tipp aus Daidais Antwort :
Es wurde festgestellt, dass das Bereitstellungsprofil in den Signaturabschnitten des Ziels auf "Keine" gesetzt war.
Das Festlegen der Felder für das Bereitstellungsprofil auf gültige Werte reichte jedoch nicht aus, um das Problem in diesem Fall zu beheben.
Weitere Untersuchungen ergaben, dass die Berechtigung Push-Benachrichtigungen ebenfalls einen Fehler aufwies. Darin stand die Funktion "Push-Benachrichtigungen zu Ihrer App-ID hinzufügen". Schritt wurde abgeschlossen, Schritt "Push-Benachrichtigungen zu Ihrer Berechtigungsdatei hinzufügen" jedoch nicht.
Nachdem Sie auf "Problem beheben" geklickt haben, um das Problem mit der Push-Benachrichtigung zu beheben, wurde der Schlüsselbundfehler behoben.
Für dieses spezielle Ziel war die Berechtigung "Schlüsselbundfreigabe" bereits zu einem früheren Zeitpunkt aktiviert worden. Das Deaktivieren hat bisher nicht dazu geführt, dass der Schlüsselbundfehler erneut auftritt. Daher ist nicht klar, ob dies in diesem Fall erforderlich ist.
quelle
In iOS 9 habe ich Address Sanitizer deaktiviert und es funktioniert auf dem Gerät.
quelle
Die einzige Lösung, die für mich funktioniert hat, war, zuerst Null für den angegebenen Schlüssel zu speichern und dann meinen neuen Wert mit einer separaten Operation zu speichern. Es würde aufgrund des Fehlers -34018 fehlschlagen, wenn ich versuchen würde, den vorhandenen Wert zu überschreiben. Aber solange ich zuerst null gespeichert habe , wird der aktualisierte Wert unmittelbar danach erfolgreich gespeichert.
quelle
Ich habe dieses Problem -34018 heute beim Ausführen der SecItemDelete-API festgestellt. Um dies zu beheben, habe ich Folgendes getan: 1. Befolgen Sie die @ k1th-Lösung https://stackoverflow.com/a/33085955/889892. 2. Führen Sie SecItemDelete im Hauptthread aus. .
Entschuldigung, es kommt wieder zurück :(
quelle
Aktivieren Sie die Schlüsselbundfreigabe in den Funktionen Ihres Projekts, um das Problem zu lösen.
quelle
Was hat bei mir funktioniert?
quelle
Für mich war es ein Problem beim Signieren von Apps. Ich habe einfach in Xcode zum richtigen Signierteam gewechselt und der Fehler ist nicht mehr aufgetreten
quelle