मैं भी इस समस्या थी, और यह मेरे हमेशा के लिए ले लिया बाहर
लगाने की "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)];
}
मैंने इसे समझ लिया था और यह अनिवार्य रूप से समस्या थी। धन्यवाद। – iHorse
जो कि एक्सकोड नमूना कोड – Olaf