2011-11-08 6 views
10

अपडेट नहीं कर रहा है मुझे अभी अपने ऐप के साथ एक दिलचस्प समस्या मिली है। ऐप में मैं उपयोगकर्ता के उपयोगकर्ता नाम और पासवर्ड को कीचेन में सहेज रहा हूं।आईओएस कीचेनइटमवेपर

keychainWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyLoginPassword" accessGroup:nil]; 

[keychainWrapper setObject:usernameField.text forKey:(id)kSecAttrAccount]; 
[keychainWrapper setObject:passwordField.text forKey:(id)kSecValueData]; 

जब यह कोड डीबग में चलाया जाता है तो यह ठीक काम करता है। यह हर बार अपडेट होता है और मैं बाद में कीचेन से आइटम पुनर्प्राप्त कर सकता हूं। जब यह वितरण में चलाया जाता है हालांकि कुंजीपटल कभी अपडेट नहीं होता है। मैंने सत्यापित किया है कि हाँ कोड की ये पंक्तियां दोनों बिल्डों में हिट होती हैं। मैं आईओएस 5 एसडीके के साथ एक्सकोड 4.2 का उपयोग कर रहा हूं और आईपैड 2 के साथ आईपैड 2 पर ऐप चला रहा हूं।

उत्तर

16

मैं भी इस समस्या थी, और यह मेरे हमेशा के लिए ले लिया बाहर

लगाने की "KeychainWrapper" का एक संस्करण है कि चारों ओर चल यह (अन्य बातों के अलावा) एक NSAssert भीतर SecItemUpdate है हो चुके हैं।

जो भी यह करता है वह एक मूर्खता है !, रिलीज/वितरण के लिए निर्माण करते समय प्रत्येक एनएसएएसएसर्ट को निरस्त कर दिया जाता है, जिसका अर्थ है कि कोड भी नहीं चलाया जाता है।

उदाहरण के लिए: प्रयास कर रहा है:

NSAssert(SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)tempCheck), @"Couldn't update the Keychain Item."); 

OSStatus status = SecItemUpdate((CFDictionaryRef)updateItem, (CFDictionaryRef)tempCheck); 
NSAssert(status == noErr, @"Couldn't update the Keychain Item."); 

सूचना कैसे वास्तविक SecItemUpdate NSAssert बाहर ले जाया जाता है, और बदले परिणाम चेक किया गया है

महत्वपूर्ण नोट बनने के लिए की जरूरत है kSecValueData के लिए मान को अपडेट करने के लिए, KSecAttrAccount के लिए मान निर्दिष्ट किए बिना, दावा भी असफल हो जाएगा। इसलिए, यदि आपका आशय संवेदनशील डेटा (जैसे क्रेडिट कार्ड नंबर की एक सूची के रूप में) की एक एकल स्ट्रिंग स्टोर करने के लिए है, इसलिए की तरह, kSecAttrAccount विशेषता में कुछ "खाता नाम" पाठ स्टोर करने के लिए सुनिश्चित हो:

static NSString* kCardListXML = @"cardListXML"; 
static NSString* cardListAccountName = @"cardListAccount"; 

-(void)setCardListXML:(NSString*)xml { 
    KeychainItemWrapper* wrapper = 
    [[KeychainItemWrapper alloc] initWithIdentifier:kCardListXML accessGroup:nil]; 
    [wrapper setObject:cardListAccountName forKey:(id)CFBridgingRelease(kSecAttrAccount)]; 
    [wrapper setObject:xml forKey:(id)CFBridgingRelease(kSecValueData)]; 
}  

-(NSString*)getCardListXML { 
    KeychainItemWrapper* wrapper = 
    [[KeychainItemWrapper alloc] initWithIdentifier:kCardListXML accessGroup:nil]; 
    [wrapper setObject:cardListAccountName forKey:(id)CFBridgingRelease(kSecAttrAccount)]; 
    return [wrapper objectForKey:CFBridgingRelease(kSecValueData)]; 
} 
+0

मैंने इसे समझ लिया था और यह अनिवार्य रूप से समस्या थी। धन्यवाद। – iHorse

+0

जो कि एक्सकोड नमूना कोड – Olaf

14

जब आप

keychainWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyLoginPassword" accessGroup:nil]; 

[keychainWrapper setObject:usernameField.text forKey:(id)kSecAttrAccount]; 
[keychainWrapper setObject:passwordField.text forKey:(id)kSecValueData]; 

शामिल आप भी

[keychainWrapper setObject:@"Myappstring" forKey: (id)kSecAttrService]; 

शामिल करने के लिए किया था या मैं एक "SIGABRT" त्रुटि मिलती है। (Myappstring) एक स्ट्रिंग है जो आपके आवेदन को परिभाषित करता है।

शायद मुझे कुछ याद आ रहा है, यह कम से कम एक बार किया जाना चाहिए।

+0

से उपलब्ध कीचेनप्रैपर के v1.2 में तय किया गया प्रतीत होता है, KeychainItemWrapper ज्यादातर मेरे लिए काम कर रहा था, कई ईमेल पते पर काम करता था (KSecAttrAccount में उपयोगकर्ता नाम के रूप में संग्रहीत), लेकिन विशेष रूप से एक ईमेल काम नहीं करता था। मैंने फिर kSecAttrService के लिए उपरोक्त पंक्ति को जोड़ा और अब सब सही है! - धन्यवाद @ एंड्रेस – dbDev

+0

मैंने थोड़ी देर के लिए इसके साथ संघर्ष किया। खुशी है कि यह –

+1

मदद मिली यह फिक्स मेरे लिए काम किया। यह समझना मुश्किल है कि त्रुटि संदेशों से क्या हो रहा है, क्योंकि यदि आपने पहले कभी इन मानों को सही तरीके से सेट किया है, तो आपको कोई त्रुटि दिखाई नहीं देगी। केवल जब आप initWithIdentifier को बदलते हैं: मान और kSecAttrService सेट करने में विफल रहता है तो आप त्रुटियां प्राप्त करना शुरू करते हैं। – carbocation