Ich habe um Apple-Foren und SO für dieses Problem vergebens gegraben. Wenn Sie versuchen, mit dem KeychainItemWrapper (ARCified) von Apple das kSecAttrAccessible
-Attribut auf alles außer dem Standard ( kSecAttrAccessibleWhenUnlocked
) zu setzen, führt dies zu einem Assertion-Fehler von SecItemUpdate, der einen Fehler zurückgibt.
Der Rest unserer Schlüsselbundupdates scheint gut zu laufen, aber die letzte Zeile ergibt:
%Vor%Der Assertionsfehler ist darauf zurückzuführen, dass SecItemUpdate () einen Status von -50 zurückgibt, der wie ein generischer Fehler "ungültige Parameter" aussieht.
Das sofortige Festlegen der kSecAttrAccessible
-Schlüssel hat keine Auswirkungen, aber wenn Sie sie auf den Standardwert kSecAttrAccessibleWhenUnlocked
setzen, wird das Problem gemildert (aber der Punkt wird eliminiert). Diese andere Frage ist die einzige zusätzliche Information, die ich gefunden habe zu iOS 8 verursacht den KeychainItemWrapper zum Absturz. Wenn Sie ein Gerät mit iOS 7 oder einen Simulator auf iOS 7/8 erstellen, wird das Problem behoben. Es flammt nur auf einem echten Gerät mit iOS 8 auf.
Aktualisieren
Hier ist ein breiter Überblick über das Abfragewörterbuch:
{
accc = "<SecAccessControlRef: 0x1687cc70>";
acct = ...;
agrp = ...;
cdat = "2014-10-13 22:22:47 +0000";
desc = "";
gena = ...;
labl = "";
mdat = "2014-10-13 22:34:16 +0000";
pdmn = cku; <-- kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
svce = ...;
sync = 0;
tomb = 0;
"v_Data" = <>;
}
und der Parameter attributesToUpdate:
{
accc = "<SecAccessControlRef: 0x1687cc70>";
acct = ...;
agrp = ...;
cdat = "2014-10-13 22:22:47 +0000";
desc = "";
gena = ...;
labl = "";
mdat = "2014-10-13 22:34:16 +0000";
pdmn = ak; <-- kSecAttrAccessibleWhenUnlocked
svce = ...;
sync = 0;
tomb = 0;
"v_Data" = <>;
}
Ich habe bestätigt, dass das Ändern anderer Felder (z. B. kSecAttrService, kSecAttrAccount) die gleichen Auswirkungen auf die entsprechenden Felder in den Wörterbüchern hat, jedoch mit einem erwarteten Status von 0.
Ich hatte auch das genaue Problem. Gab mir:
OSStatus-Fehler -50 - Konflikte verursachende kSecAccess- und kSecAccessControl-Attribute
Sofort nach der Aktualisierung bei allen meinen Nutzern im App Store abgestürzt.
Hat das Gleiche getan wie Peter. Ergreift die Daten, löschte das Element und fügte es als neues Element ein, anstatt zu versuchen, das vorhandene Element zu aktualisieren.
Ich denke, das ist ein Apple Bug.
Ich habe eine TSI geöffnet, aber sie haben mich noch nicht kontaktiert.
Von was ich verstehe, passiert es Benutzern von iOS7 zu iOS 8 aktualisiert, wo ihre erste App mit XCode für iOS7 kompiliert wurde (bevor iOS 8 war), und dann auf iOS8 auf die neue App, die mit kompiliert wurde aktualisiert XCode zu iOS8.
Ich hatte das gleiche Problem. Am Ende habe ich kSecAttrAccessibile getestet und wenn es nicht das war, was ich wollte, habe ich den Wert und die Attribute im Schlüsselbund in lokalen Variablen aufgezeichnet, setze den Schlüsselbund zurück, setze kSecAttrAccessible wie gewünscht und setze dann den Wert und die Attribute im Schlüsselbund auf ihre ursprünglichen Einstellungen.
Ein Schuss in die Dunkelheit hier:
Möglicherweise ist auf dem iOS-Gerät die iCloud-Synchronisierung aktiviert und das Hinzufügen eines Elements, das nicht gerätespezifisch ist, und das anschließende Erstellen von ThisDeviceOnly führt zum Fehler. iOS8 hat möglicherweise auch das Verhalten geändert.
Können Sie versuchen, die Reihenfolge der Attribute zu ändern, die auf keychain festgelegt sind
? %Vor%Wenn das nicht hilft, sollten Sie KeychainItemWrapper so ändern, dass es so aussieht
%Vor%Tags und Links objective-c keychain ios8