2011-08-22 16 views
21

मैं जानना चाहता हूं कि मेरे ऐप की कीचेन को रीसेट करने का कोई तरीका है या नहीं। मैं कुछ भी कीचेन के लिएएक आईफोन ऐप की कीचेन रीसेट करें

तरह

[NSUserDefaults resetStandardUserDefaults]

मौजूद है कि क्या सोच रहा हूँ। ऐप हटा दिए जाने के बाद भी मुख्य श्रृंखला रीसेट नहीं होती है। अभी तक मुझे पता है कि एकमात्र तरीका उन्हें ऐप से एक-एक करके रीसेट करना है।

+0

@ सेर्ज-के, उस प्रश्न को 2012 में पूछा गया था, जबकि यह 2011 में था। –

+0

सच है, बस यहां पाया गया अन्य उत्तर http://stackoverflow.com/questions/14086085/how-to-delete-all -किचैन-आइटम-सुलभ-टू-ए-ऐप एक अधिक अद्यतित समाधान है। मैं इसे सिर्फ एक लिंक के रूप में छोड़ सकता हूं, मैंने डुप्लिकेट ध्वज हटा दिया। –

उत्तर

52

जवाब के सभी के रूप में अब तक कि आप पहचानकर्ता पता है कि तुम को हटाने के लिए मैं निम्नलिखित समाधान है कि अनुप्रयोग के लिए सभी मौजूदा कुंजी हटाता सबमिट करना चाहते हैं (केवल iOS)

-(void)resetKeychain { 
    [self deleteAllKeysForSecClass:kSecClassGenericPassword]; 
    [self deleteAllKeysForSecClass:kSecClassInternetPassword]; 
    [self deleteAllKeysForSecClass:kSecClassCertificate]; 
    [self deleteAllKeysForSecClass:kSecClassKey]; 
    [self deleteAllKeysForSecClass:kSecClassIdentity]; 
} 

-(void)deleteAllKeysForSecClass:(CFTypeRef)secClass { 
    NSMutableDictionary* dict = [NSMutableDictionary dictionary]; 
    [dict setObject:(__bridge id)secClass forKey:(__bridge id)kSecClass]; 
    OSStatus result = SecItemDelete((__bridge CFDictionaryRef) dict); 
    NSAssert(result == noErr || result == errSecItemNotFound, @"Error deleting keychain data (%ld)", result); 
} 
चाहते पर निर्भर करता है

स्विफ्ट 2.2 संस्करण:

func resetKeychain() { 
    self.deleteAllKeysForSecClass(kSecClassGenericPassword) 
    self.deleteAllKeysForSecClass(kSecClassInternetPassword) 
    self.deleteAllKeysForSecClass(kSecClassCertificate) 
    self.deleteAllKeysForSecClass(kSecClassKey) 
    self.deleteAllKeysForSecClass(kSecClassIdentity) 
} 

func deleteAllKeysForSecClass(secClass: CFTypeRef) { 
    let dict: [NSString : AnyObject] = [kSecClass : secClass] 
    let result = SecItemDelete(dict) 
    assert(result == noErr || result == errSecItemNotFound, "Error deleting keychain data (\(result))") 
} 

स्विफ्ट 3 संस्करण

func resetKeychain() { 
    deleteAllKeysForSecClass(kSecClassGenericPassword) 
    deleteAllKeysForSecClass(kSecClassInternetPassword) 
    deleteAllKeysForSecClass(kSecClassCertificate) 
    deleteAllKeysForSecClass(kSecClassKey) 
    deleteAllKeysForSecClass(kSecClassIdentity) 
} 

func deleteAllKeysForSecClass(_ secClass: CFTypeRef) { 
    let dict: [NSString : Any] = [kSecClass : secClass] 
    let result = SecItemDelete(dict as CFDictionary) 
    assert(result == noErr || result == errSecItemNotFound, "Error deleting keychain data (\(result))") 
} 
+4

क्या फ़ोन का उपयोग कर मैन्युअल रूप से सभी कीचेन को हटाने का कोई तरीका है? निर्देशों की तरह कुछ [यहां] (http://www.imore.com/how-access-and-view-your-icloud-keychain-passwords-ios-7) – abbood

+2

@abbood प्रोग्रामेटिक रूप से असंभव होना चाहिए। क्यूं कर? चूंकि आपका ऐप सैंडबॉक्स किया गया है और आप कभी भी अन्य ऐप से ** सभी कीचेन आइटम ** को हटाने में सक्षम नहीं होंगे। केवल मैं अनुमान लगा रहा हूं * संभावित परिदृश्य सिम्युलेटर का उपयोग करना होगा 'आईओएस सिम्युलेटर -> सामग्री और सेटिंग्स रीसेट करें – Honey

-5
- (void)resetKeychainItem 
{ 
    OSStatus junk = noErr; 
    if (!keychainItemData) { 
     self.keychainItemData = [[NSMutableDictionary alloc] init]; 
    } else if (keychainItemData){ 
     NSMutableDictionary *tempDictionary = [self dictionaryToSecItemFormat:keychainItemData]; 
     junk = SecItemDelete((CFDictionaryRef)tempDictionary); 
     if (junk != noErr) { 
      UIAlertView *dialog = [[UIAlertView alloc] initWithTitle:@"Keychain Error" message:[NSString stringWithFormat:@"A problem with updating the secure Keychain items with this information (likely, this email address information is duplicated in another Player). Error code: %d %@", junk, [self resultText:-junk]] delegate:self cancelButtonTitle:NSLocalizedStringFromTable(@"Ok", @"Localizable", @"display text") otherButtonTitles:nil]; 
      [dialog show]; 
      [dialog release]; 
      //NSAssert(junk == noErr || junk == errSecItemNotFound, @"Problem deleting current dictionary."); 
      return; 
     } 
    } 

    // Default attributes for keychain item. 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrAccount]; 
    [keychainItemData setObject:@"" forKey:(id)kSecValueData]; 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrLabel]; 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrDescription]; 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrComment]; 
    // Default data for keychain item. 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrModificationDate]; 
    [keychainItemData setObject:@"" forKey:(id)kSecAttrService]; 


} 
+0

क्या आप उपयोगकर्ताओं को यह समझने में सहायता के लिए कुछ टिप्पणियां जोड़ सकते हैं कि आपका कोड क्या कर रहा है –

+0

@JimP, क्या आप थोड़ा सा स्पष्टीकरण दे सकते हैं। आपको अभी भी रीसेट करने के लिए सभी चाबियाँ प्रदान करने की आवश्यकता है? मेरे पास बहुत सारी सुरक्षित जानकारी है और मैं उन सभी को रीसेट करना चाहता हूं, इसकी ज़रूरत है। –

+4

क्या एक उग्र जवाब ... – Chris

11
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"nameOfYourKeychain" accessGroup:nil]; 

[keychainItem resetKeychainItem]; 

बहुत सरल :)

संपादित करें: एक प्रश्न के उत्तर में नीचे से पूछा - KeychainItemWrapper क्या है?

यह एक वर्ग एप्पल द्वारा लिखित है कि आप यहां से डाउनलोड कर सकते हैं: http://developer.apple.com/library/ios/#samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_m.html

अपनी परियोजना के लिए यह जोड़े और फिर इसे आयात जहां आप इसका इस्तेमाल करना चाहते हैं। फिर ऊपर दिए गए कोड स्निपेट का उपयोग करें।

+2

हाय, KeychainItemWrapper क्या है? – hzxu

+0

@hzxu ने उत्तर को अपडेट किया, धन्यवाद। – jcrowson

+1

धन्यवाद, लेकिन अगर मुझे कई कुंजी-मूल्य जोड़े होने की आवश्यकता है, और मैं अपनी सभी सामग्री के लिए एक शब्दकोश का उपयोग नहीं कर सकता हूं और इसे 'kSecValueData' जैसी मानक कुंजी के विरुद्ध संग्रहीत कर सकता हूं क्योंकि मान को स्ट्रिंग होने की आवश्यकता है, तो मुझे इसे बनाने की आवश्यकता है मेरे कुंजी-मूल्य जोड़े की संख्या के रूप में कई 'KeychainItemWrapper'? – hzxu

2

की @ वेगार्ड के समाधान ब्लॉक आधारित संस्करण:

void (^deleteAllKeysForSecClass)(CFTypeRef) = ^(CFTypeRef secClass) { 
    id dict = @{(__bridge id)kSecClass: (__bridge id)secClass}; 
    OSStatus result = SecItemDelete((__bridge CFDictionaryRef) dict); 
    NSAssert(result == noErr || result == errSecItemNotFound, @"Error deleting keychain data (%d)", (int)result); 
}; 
deleteAllKeysForSecClass(kSecClassGenericPassword); 
deleteAllKeysForSecClass(kSecClassInternetPassword); 
deleteAllKeysForSecClass(kSecClassCertificate); 
deleteAllKeysForSecClass(kSecClassKey); 
deleteAllKeysForSecClass(kSecClassIdentity); 

जो सिर्फ सहायक तरीकों के बिना में कोड ड्रॉप चाहते हम में से उन लोगों के लिए।

+0

इसके लिए धन्यवाद। यह भी सबसे सरल और सबसे अभिव्यक्तिपूर्ण कार्यान्वयन है। –

संबंधित मुद्दे