Ich speichere derzeit den Benutzernamen (E-Mail) und einen gesalzenen Hash der E-Mail und des Passworts in iOS KeyChain. Ich verwende die ARC'ified Version gefunden hier .
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
[wrapper setObject:APP_NAME forKey:(__bridge id)kSecAttrService];
[wrapper setObject:email forKey:(__bridge id)kSecAttrAccount];
[wrapper setObject:token forKey:(__bridge id)kSecValueData];
Dies alles funktioniert einwandfrei, wenn ich das Token für meine Netzwerkanrufe herausziehen muss, während die App aktiv ist. Es funktioniert für die Anmeldung von einem sauberen Start sowie für alle Netzwerkanrufe im gesamten Gebäude. Das Problem beginnt, wenn sich die App im Hintergrund befindet.
Denken Sie daran, dass dies nur sporadisch geschieht und ich es noch nicht auf eine bestimmte iOS-Version oder ein bestimmtes iOS-Gerät festgelegt habe.
Der Benutzer löst einen Standort aus (Regionsüberwachung) und ich möchte den Server mit seinem Status aktualisieren. Ich versuche, das Token wie bei jedem anderen Netzwerkanruf aus dem Schlüsselbund zu ziehen und den Status zu aktualisieren. Für einige Benutzer ist der Wert jedoch Null. Ohne sie kann ich das Netzwerkmaterial nicht aktualisieren. Warum sollte dies für die meisten funktionieren, aber nicht für einen kleinen Prozentsatz?
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
NSString *token = [wrapper objectForKey:(__bridge id)kSecValueData];
Ich bin zur Nicht-ARC-Version des Schlüsselbundverpackers zurückgekehrt, erhalte aber immer noch die gleichen Ergebnisse. Ich würde mich über jedes Feedback dazu freuen. Es ist nur ein kleiner Teil meiner Benutzer, aber es ist ein Problem, das ich beheben möchte und über das ich mir keine Sorgen machen möchte. Danke im Voraus.
Außerdem wird meine gesamte Hintergrundarbeit in einer backgroundTask eingerichtet, um zu verhindern, dass Zeitüberschreitungen auftreten. Ich habe keine Probleme mit der Arbeit rund um den Schlüsselbund, aber ich lasse die Dinge nicht weitergehen, bis mein Token gefüllt ist.
BEARBEITEN Ich habe mein Problem mit dem Schlüsselbund herausgefunden, bei dem keine Werte aus dem Hintergrund abgerufen werden. Ich werde die Antwort unten posten und akzeptieren, da ich der Meinung bin, dass diese Frage später für andere wertvoll werden kann.
quelle
…AccessibleAlways
wenn möglich, oder speichern Sie ein Token, das nur eingeschränkte Berechtigungen bietet (z. B. ein Token, mit dem Sie nach neuen Feed-Elementen lesen, aber nicht posten können). Sie verzichten damit explizit auf eine Verschlüsselungsstufe. Wenn Ihre App bis zur ersten Entsperrung warten kann, ist es möglicherweise am besten,…AfterFirstUnlock
Ihre Benutzer zu verwenden und anzuweisen, ihre Geräte zuerst zu entsperren.Verwenden Sie
kSecAttrAccessibleAfterFirstUnlock
anstelle vonkSecAttrAccessibleAlways
.Aus Apples Dokumentation :
quelle
kSecAttrAccessibleAlways
bereits veraltet istIn meinem Fall greift watchOS2 auf der iOS-Seite auf Schlüsselbunddaten zu.
Zu Beginn wird kSecAttrAccessibleWhenUnlockedThisDeviceOnly verwendet. Ich kann die Daten lesen, egal ob das iPhone gesperrt ist oder nicht. Es ist sehr verwirrend für mich, dass ich einen Fehler erhalte, wenn watch versucht, auf den Schlüsselbund zuzugreifen :: SecTrustEvaluate [leaf IssuerCommonName SubjectCommonName]
In einigen Fällen wird es zu :: SecOSStatusWith Fehler: [- 25308] Fehler Domain = NSOSStatusErrorDomain Code = -25308 "ks_crypt: e00002e2 konnte den Artikel nicht" oe "(Klasse 6, Tasche: 0) Zugriff auf den Artikel versucht, während der Schlüsselbund gesperrt ist. "" UserInfo = {NSDescription = ks_crypt: e00002e2 konnte den Artikel nicht "oe" (Klasse 6, Tasche: 0) Zugriff auf den Artikel versucht, während der Schlüsselbund gesperrt ist.}
Ich werde meine Antwort aktualisieren, wenn ich mehr Infos bekomme.
quelle