Mam ekran logowania w mojej aplikacji na iOS. Nazwa użytkownika i hasło zostaną zapisane NSUserDefaults
i ponownie załadowane na ekran logowania po ponownym wejściu do aplikacji (oczywiście NSUserDefaults
są stałe).
Teraz użytkownik ma możliwość wyłączenia funkcji zapisywania nazwy użytkownika / hasła.
Więc to NSUserDefaults
zostanie wyczyszczone.
Ale w mojej aplikacji potrzebuję tej nazwy użytkownika / hasła do zapytań do bazy danych dla użytkownika. Więc: Gdzie przechowywać dane oprócz NSUserDefaults
? (To miejsce może / powinno zostać usunięte, gdy użytkownik zamknie aplikację lub wyloguje się).
ios
nsuserdefaults
keychain
Kovu
źródło
źródło
Odpowiedzi:
Zawsze należy używać pęku kluczy do przechowywania nazw użytkowników i haseł, a ponieważ jest on przechowywany bezpiecznie i dostępny tylko dla Twojej aplikacji, nie ma potrzeby usuwania go po zamknięciu aplikacji (jeśli to było twoje zmartwienie).
Apple udostępnia przykładowy kod, który przechowuje, odczytuje i usuwa elementy pęku kluczy, a oto sposób użycia klasy opakowania pęku kluczy z tej próbki, co znacznie upraszcza korzystanie z pęku kluczy.
Dołącz Security.framework (w Xcode 3 kliknij prawym przyciskiem myszy folder frameworks i dodaj istniejącą ramę. W Xcode 4 wybierz projekt, następnie wybierz cel, przejdź do zakładki Fazy kompilacji i kliknij + w obszarze Połącz pliki binarne z plikami) i KeychainItemWrapper .h &. m plików do swojego projektu, #importuj plik .h wszędzie tam, gdzie potrzebujesz użyć pęku kluczy, a następnie utwórz instancję tej klasy:
( YourAppLogin może być dowolną nazwą twojego elementu pęku kluczy i możesz mieć wiele elementów w razie potrzeby)
Następnie możesz ustawić nazwę użytkownika i hasło, używając:
Zdobądź je, używając:
Lub usuń je za pomocą:
źródło
kSecValueData
orazkSecAttrAccount
w kodzie Objective-C, więc pamiętaj, aby rzucić je za pomocą(__bridge id)
, np.[keychainItem setObject:obj forKey:(__bridge id)kSecValueData];
Jeśli potrzebujesz wersji opakowania ARC tutaj jest link https://gist.github.com/1170641 Dzięki
źródło
Bardzo łatwe rozwiązanie za pomocą pęku kluczy .
Jest to proste opakowanie systemu pęku kluczy. Wystarczy dodać
SSKeychain.h
,SSKeychain.m
,SSKeychainQuery.h
iSSKeychainQuery.m
pliki do projektu i dodać Security.framework do celu.Aby zapisać hasło:
Aby odzyskać hasło:
Gdzie
setPassword
jest wartość, którą chcesz zapisać, iforService
jaką zmienną chcesz zapisać, a konto jest dla jakiego użytkownika / obiektu jest hasło i wszelkie inne informacje.źródło
NSString *username = [[SSKeychain accountsForService:@"AnyService"][0] valueForKey:@"acct"]
. Powinno to działać poprawnie, jeśli używasz tylko jednego konta. Jak zawsze sprawdź długość tablicy przed próbą uzyskania dostępu do indeksu 0.Możesz po prostu użyć
NSURLCredential
, zapisze zarówno nazwę użytkownika, jak i hasło w pęku kluczy w zaledwie dwóch liniach kodu .Zobacz moją szczegółową odpowiedź .
źródło
Postanowiłem odpowiedzieć, jak używać pęku kluczy w iOS 8, używając Obj-C i ARC.
1) Użyłem keychainItemWrapper (wersja ARCifief) z GIST: https://gist.github.com/dhoerl/1170641/download - Dodaj (+ skopiuj) KeychainItemWrapper.h i .m do twojego projektu
2) Dodaj strukturę zabezpieczeń do swojego projektu (sprawdź w projekcie> Fazy budowania> Połącz pliki binarne z bibliotekami)
3) Dodaj bibliotekę zabezpieczeń (#import) i KeychainItemWrapper (#import „KeychainItemWrapper.h”) do pliku .h i .m, w którym chcesz użyć pęku kluczy.
4) Aby zapisać dane w pęku kluczy:
5) Odczytaj dane (prawdopodobnie ekran logowania podczas ładowania> viewDidLoad):
Cieszyć się!
źródło
Jeśli masz problem z odzyskaniem hasła za pomocą opakowania pęku kluczy, użyj tego kodu:
źródło
sprawdź ten przykładowy kod próbowałem najpierw otoki jabłka z przykładowego kodu, ale jest to dla mnie o wiele prostsze
źródło
Spróbuj tego:
niech to pomoże.
źródło
Spojrzałem na użycie KeychainItemWrapper (wersja ARC), ale nie znalazłem tego opakowania Objective C tak zdrowe, jak to pożądane.
Użyłem tego rozwiązania przez Kishikawa Katsumi , co oznaczało pisałem mniej kodu i nie trzeba używać odlewane do przechowywania wartości NSString.
Dwa przykłady przechowywania:
Dwa przykłady pobierania
źródło
W powyższym kodzie jest mały błąd (przy okazji, Dave bardzo pomógł Twojemu postowi, dziękuję)
W części, w której zapisujemy dane uwierzytelniające, potrzebny jest również następujący kod, aby działać poprawnie.
najprawdopodobniej dlatego, że po raz drugi próbujemy (ponownie) zalogować się przy użyciu tych samych poświadczeń, aby znaleźć je już przypisane w elementach pęku kluczy i aplikacja ulega awarii. z powyższym kodem działa jak urok.
źródło
Aby zaktualizować to pytanie:
Dla tych, którzy korzystają z usługi Swift, ta implementacja szybkiego przeciągania i upuszczania przez Mihai Costea obsługuje grupy dostępu:
https://github.com/macostea/KeychainItemWrapper.swift/blob/master/KeychainItemWrapper.swift
Przed użyciem pęku kluczy: rozważ dwa razy, zanim zapiszesz hasło. W wielu przypadkach przechowywanie tokena uwierzytelniającego (takiego jak identyfikator sesji trwałej) i adres e-mail lub nazwa konta mogą być wystarczające. Możesz łatwo unieważnić tokeny uwierzytelniające, aby zablokować nieautoryzowany dostęp, wymagając od użytkownika ponownego zalogowania się na zaatakowanym urządzeniu, ale nie wymagając resetowania hasła i konieczności ponownego zalogowania się na wszystkich urządzeniach (my nie tylko używamy Apple'a?).
źródło
Ale teraz możesz wybrać NURLCredential zamiast opakowania pęku kluczy. Robi to, co musimy zrobić.
źródło
Dla szybkiego możesz użyć tej biblioteki:
https://github.com/jrendel/SwiftKeychainWrapper
Obsługuje wszystkie wersje swift.
źródło
Następujące elementy powinny działać dobrze:
źródło