2012-12-29 15 views
31

Mam zabłąkane elementy keychain na iOS (prawdopodobnie napisane przez starą wersję aplikacji), które muszę usunąć. Czy istnieje prosty sposób na osiągnięcie tego?Jak usunąć wszystkie elementy keychain dostępne dla aplikacji?

+1

zobaczyć http://stackoverflow.com/questions/10966969/enumerate-all-keychain-items-in-my-ios-application uzyskania wszystkie elementy, które można uzyskać dostęp, a następnie usunąć każdą jedną .. –

Odpowiedz

62

to zrobić dla wszystkich klas

NSArray *secItemClasses = @[(__bridge id)kSecClassGenericPassword, 
         (__bridge id)kSecClassInternetPassword, 
         (__bridge id)kSecClassCertificate, 
         (__bridge id)kSecClassKey, 
         (__bridge id)kSecClassIdentity]; 
for (id secItemClass in secItemClasses) { 
    NSDictionary *spec = @{(__bridge id)kSecClass: secItemClass}; 
    SecItemDelete((__bridge CFDictionaryRef)spec); 
} 
+1

Wielkie dzięki! Przyjęty. – sqreept

+0

Używam literału dla NSDictionary, więc jego xcode4.5 +, ale jeśli someneone potrzebuje starszego wsparcia dla gcc/llvm, użyj dictionaryWithObject: forKey: –

+4

To nie jest słownik dosłowny, powinien to być 'NSDictionary * spec = @ {(__ bridge id) kSecClass: secItemClass}; ' – kevboh

1

Możesz rzucić okiem na aplikację KeyChain Access znalezioną w folderze Narzędzia. Jeśli uruchomisz aplikację i klikniesz "Wszystkie elementy", powinna wyświetlić wszystkie elementy, które utworzyłeś na tym konkretnym komputerze. Deweloperzy zwykle zaczynają od com.

+0

W przypadku komputerów Mac twoja odpowiedź jest idealna, ale w systemie iOS aplikacja Dostęp do pęku kluczy nie istnieje. Dzięki i tak! – sqreept

6

Dzięki Daij-Djan mam do tego rozwiązania:

for (id secclass in @[ 
    (__bridge id)kSecClassGenericPassword, 
    (__bridge id)kSecClassInternetPassword, 
    (__bridge id)kSecClassCertificate, 
    (__bridge id)kSecClassKey, 
    (__bridge id)kSecClassIdentity]) { 
    NSMutableDictionary *query = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
            secclass, (__bridge id)kSecClass, 
            nil]; 

    SecItemDelete((__bridge CFDictionaryRef)query);   
} 
+0

Mam to samo teraz: D hehe –

+0

miło widzieć, że raz OP pracuje z Tobą nad odpowiedzią :) –

+1

Potrzebuję odpowiedzi. Muszę pracować ... prawda? – sqreept

9

wersji Xamarin iOS (MonoTouch) z accepted answer na Jak usunąć wszystkie Brelok przedmiotów dostępne dla aplikacji jest poniżej:

foreach (var recordKind in new []{ 
       SecKind.GenericPassword, 
       SecKind.Certificate, 
       SecKind.Identity, 
       SecKind.InternetPassword, 
       SecKind.Key, 
      }) 
    { 
      SecRecord query = new SecRecord(recordKind); 
      SecKeyChain.Remove(query); 
    } 

Jeśli chcesz się upewnić, że rzeczywiście usunąć rekordy, możesz podczas rozwoju liczby kontrolnej pozycji w Keychain specyficznego rodzaju przed i po z tym kodem:

SecStatusCode scc; 
var records = SecKeyChain.QueryAsRecord(new SecRecord(SecKind.GenericPassword), 1000, out scc); 
+1

Dziękuję bardzo! –

8

przepisałem odpowiedź Daij-Djan w Swift :

let secItemClasses = [kSecClassGenericPassword, 
    kSecClassInternetPassword, 
    kSecClassCertificate, 
    kSecClassKey, 
    kSecClassIdentity] 
for secItemClass in secItemClasses { 
    let dictionary = [kSecClass as String:secItemClass] 
    SecItemDelete(dictionary) 
} 
+0

Ten kod spowodował awarie dla mnie. Wystąpił problem z konwersją CFHash do Int w zmiennej hashValue (przynajmniej na platformach 32-bitowych). CFHash zwraca UINT, który może przepełnić się po przekonwertowaniu na Int in swift. Sugeruję zmianę tej linii na 'public var hashValue: Int {return Int (bitPattern: CFHash (self))}, aby upewnić się, że nie przepełni się. – Brett

+1

CFString jest mostkowany do NSString, który jest zmostkowany do szybkich łańcuchów, więc możesz po prostu je rzucić, tzn. Niech słownik = [kSecClass jako ciąg: secItemClass jako ciąg] ' – Brandon

+3

Kompilator Swift 3 będzie narzekał, chyba że napiszesz:" SecItemDelete (słownik jako CFDictionary) " – Laurent

Powiązane problemy