Ich habe einen Anmeldebildschirm in meiner iOS-App. Der Benutzername und das Passwort werden im gespeichert NSUserDefaults
und beim erneuten Aufrufen der App erneut in den Anmeldebildschirm geladen (natürlich NSUserDefaults
permanent).
Jetzt hat der Benutzer die Möglichkeit, die Funktion zum Speichern von Benutzernamen und Passwort zu deaktivieren.
Also NSUserDefaults
wird das dann gelöscht.
In meiner App benötige ich diesen Benutzernamen / dieses Passwort jedoch für Datenbankabfragen für den Benutzer. Also: Wo sollen die Daten außer gespeichert werden NSUserDefaults
? (Dieser Ort kann / sollte gelöscht werden, wenn der Benutzer die App beendet oder sich abmeldet.)
ios
nsuserdefaults
keychain
Kovu
quelle
quelle
Antworten:
Sie sollten immer Schlüsselbund verwenden, um Benutzernamen und Kennwörter zu speichern. Da diese sicher gespeichert sind und nur für Ihre App zugänglich sind, müssen Sie sie nicht löschen, wenn die App beendet wird (wenn dies Ihr Anliegen war).
Apple bietet Beispielcode zum Speichern, Lesen und Löschen von Schlüsselbundelementen. Hier erfahren Sie, wie Sie die Schlüsselbund-Wrapper-Klasse aus diesem Beispiel verwenden, was die Verwendung von Schlüsselbund erheblich vereinfacht.
Schließen Sie Security.framework ein (klicken Sie in Xcode 3 mit der rechten Maustaste auf den Ordner "Frameworks" und fügen Sie ein vorhandenes Framework hinzu. Wählen Sie in Xcode 4 Ihr Projekt aus, wählen Sie dann das Ziel aus, wechseln Sie zur Registerkarte "Phasen erstellen" und klicken Sie unter "Binär mit Dateien verknüpfen" auf +) und "KeychainItemWrapper .h &". m Dateien in Ihr Projekt importieren, # die .h-Datei überall dort importieren, wo Sie den Schlüsselbund verwenden müssen, und dann eine Instanz dieser Klasse erstellen:
( YourAppLogin kann alles sein, was Sie zum Aufrufen Ihres Schlüsselbundartikels ausgewählt haben, und Sie können bei Bedarf mehrere Artikel haben.)
Dann können Sie den Benutzernamen und das Passwort festlegen mit:
Holen Sie sie mit:
Oder löschen Sie sie mit:
quelle
kSecValueData
undkSecAttrAccount
des Objective-C-Codes anschreien. Stellen Sie daher sicher, dass Sie diese mit(__bridge id)
z. B.[keychainItem setObject:obj forKey:(__bridge id)kSecValueData];
Wenn Sie eine ARC-Version des Wrappers benötigen, finden Sie hier den Link https://gist.github.com/1170641 Dank an
quelle
Eine sehr einfache Lösung über Schlüsselanhänger .
Es ist ein einfacher Wrapper für das System Keychain. Fügen Sie einfach die
SSKeychain.h
,SSKeychain.m
,SSKeychainQuery.h
undSSKeychainQuery.m
Dateien zu Ihrem Projekt und fügen Sie den Security.framework zu Ihrem Ziel.So speichern Sie ein Passwort:
So rufen Sie ein Passwort ab:
Wo
setPassword
ist der Wert, unter dem Sie gespeichert werden möchten, undforService
unter welcher Variablen soll er gespeichert werden? Das Konto gibt an, für welchen Benutzer / welches Objekt das Kennwort und alle anderen Informationen bestimmt sind.quelle
NSString *username = [[SSKeychain accountsForService:@"AnyService"][0] valueForKey:@"acct"]
. Dies sollte gut funktionieren, wenn Sie nur ein Konto verwenden. Überprüfen Sie wie immer die Array-Länge, bevor Sie versuchen, auf Index 0 zuzugreifen.Sie können es einfach verwenden
NSURLCredential
, es speichert sowohl den Benutzernamen als auch das Passwort im Schlüsselbund in nur zwei Codezeilen .Siehe meine ausführliche Antwort .
quelle
Ich entschied mich zu beantworten, wie man Schlüsselbund in iOS 8 mit Obj-C und ARC verwendet.
1) Ich habe den keychainItemWrapper (ARCifief-Version) von GIST verwendet: https://gist.github.com/dhoerl/1170641/download - Fügen Sie Ihrem Projekt den KeychainItemWrapper.h und .m hinzu (+ kopieren)
2) Fügen Sie Ihrem Projekt das Sicherheitsframework hinzu (überprüfen Sie Projekt> Erstellungsphasen> Binärdatei mit Bibliotheken verknüpfen).
3) Fügen Sie die Sicherheitsbibliothek (#import) und den KeychainItemWrapper (#import "KeychainItemWrapper.h") zur Datei .h und .m hinzu, in der Sie den Schlüsselbund verwenden möchten.
4) So speichern Sie Daten im Schlüsselbund:
5) Daten lesen (wahrscheinlich Anmeldebildschirm beim Laden> viewDidLoad):
Genießen!
quelle
Wenn Sie Probleme beim Abrufen des Kennworts mithilfe des Schlüsselbund-Wrappers haben, verwenden Sie diesen Code:
quelle
Auschecken dieses Beispielcodes Ich habe zuerst den Wrapper des Apfels aus dem Beispielcode ausprobiert, aber das ist für mich viel einfacher
quelle
Probier diese:
möge es helfen.
quelle
Ich habe mir die Verwendung von KeychainItemWrapper (der ARC-Version) angesehen, aber ich fand den Objective C-Wrapper nicht so gesund wie gewünscht.
Ich habe diese Lösung von Kishikawa Katsumi verwendet , was bedeutete, dass ich weniger Code geschrieben habe und keine Casts zum Speichern von NSString-Werten verwenden musste.
Zwei Beispiele für die Speicherung:
Zwei Beispiele für das Abrufen
quelle
Es gibt einen kleinen Fehler im obigen Code (übrigens, Dave, es war sehr hilfreich, deinen Beitrag zu schreiben, danke)
In dem Teil, in dem wir die Anmeldeinformationen speichern, wird außerdem der folgende Code benötigt, um ordnungsgemäß zu funktionieren.
Dies liegt höchstwahrscheinlich daran, dass wir beim zweiten Versuch, uns mit denselben Anmeldeinformationen (erneut) anzumelden, diese bereits in den Schlüsselbundelementen zugewiesen finden und die App abstürzt. Mit dem obigen Code funktioniert es wie ein Zauber.
quelle
So aktualisieren Sie diese Frage:
Für diejenigen, die Swift Checkout verwenden, ist diese schnelle Drag & Drop-Implementierung von Mihai Costea, die Zugriffsgruppen unterstützt:
https://github.com/macostea/KeychainItemWrapper.swift/blob/master/KeychainItemWrapper.swift
Vor der Verwendung des Schlüsselbunds: Überlegen Sie zweimal, bevor Sie Kennwörter speichern. In vielen Fällen reicht es möglicherweise aus, ein Authentifizierungstoken (z. B. eine Persistenzsitzungs-ID) und den E-Mail- oder Kontonamen zu speichern. Sie können Authentifizierungstoken leicht ungültig machen, um nicht autorisierten Zugriff zu blockieren. Der Benutzer muss sich erneut auf dem gefährdeten Gerät anmelden, muss jedoch kein Kennwort zurücksetzen und muss sich auf allen Geräten erneut anmelden (wir verwenden nicht nur Apple, oder?).
quelle
Jetzt können Sie sich für NURLCredential anstelle des Schlüsselbund-Wrappers entscheiden. Es macht das, was wir tun müssen.
quelle
Für schnelle können Sie diese Bibliothek verwenden:
https://github.com/jrendel/SwiftKeychainWrapper
Es unterstützt alle Versionen von Swift.
quelle
Folgendes sollte gut funktionieren:
quelle