2012-12-29 49 views
31

我有我需要刪除的iOS上丟失鑰匙串項目(可能由舊版本的應用程序編寫)。有沒有簡單的方法來實現這一目標?如何刪除應用程序可訪問的所有鑰匙串項目?

+1

看到http://stackoverflow.com/questions/10966969/enumerate-all-keychain-items-in-my-ios-application爲讓您可以訪問所有的項目,然後刪除每一個.. –

回答

62

做的所有類

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

非常感謝!公認。 – sqreept

+0

我使用一個字面值爲NSDictionary,所以它的xcode4.5 +,但如果某人需要更老的gcc/llvm支持使用dictionaryWithObject:forKey: –

+4

這不是一個字典文字,它應該是'NSDictionary * spec = @ {(__ bridge id)kSecClass: secItemClass};' – kevboh

1

您可以查看Utilities文件夾中的KeyChain Access應用程序。如果啓動該應用程序並單擊「所有項目」,它應顯示您使用此特定計算機創建的所有項目。開發人員通常以com開頭。

+0

對於Mac,您的答案是完美的,但在iOS上,Keychain Access應用程序不存在。不管怎麼說,還是要謝謝你! – sqreept

6

由於Daij-Djan我得到這個解決方案:

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

現在我得到了同樣的結果:嘿嘿 –

+0

很高興看到,一旦OP與您合作的答案:) –

+1

我需要的答案。我必須做的工作...對嗎? – sqreept

9

Xamarin的iOS版本(MonoTouch的)的accepted answer如何刪除所有鑰匙串項可訪問的應用程序低於:

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

如果你想確保你確實刪除記錄,你可能期間之前特定種類的鑰匙串項目的發展支票號碼後,此代碼:

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

非常感謝! –

8

我在斯威夫特改寫Daij-Djan的答案:

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

此代碼導致我崩潰。問題發生在hashValue變量(至少在32位平臺上)中進行CFHash到Int轉換。 CFHash返回一個UINT,它在swift中轉換爲Int時可能會溢出。我建議將該行更改爲'public var hashValue:Int {return Int(bitPattern:CFHash(self))}'以確保它不會溢出。 – Brett

+1

CFString免費橋接到NSString,橋接到swift字符串,所以你可以施放它們,即'let dictionary = [kSecClass as String:secItemClass as String]' – Brandon

+3

Swift 3編譯器會抱怨,除非你寫:「SecItemDelete(dictionary作爲CFDictionary)「 – Laurent

相關問題