2013-11-03 5 views
14

ऐप्पल ने GenericKeyChain sample code में KeyChainItemWrapper क्लास प्रदान किया है। एसओ पर यहां एक एआरसीड समाधान है, जिसे मैं अनुसरण करने की कोशिश कर रहा हूं: wrapper आईओएस पर कीचेन में स्टोर करने के लिए।पासवर्ड के लिए KeyChainItemWrapper क्रैश में सहेजना

आवरण का उपयोग इस तरह है:

KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"F11-email-auth" accessGroup:nil]; 
[keychain setObject:[emailTextfield text] forKey:(__bridge id)(kSecMatchEmailAddressIfPresent)]; 
[keychain setObject:[passwordTextfield text] forKey:(__bridge id)(kSecClassGenericPassword)]; 

ईमेल पाठ क्षेत्र के साथ लाइन स्वीकार किया जाता है। लेकिन पासवर्ड के साथ दूसरी पंक्ति निम्नलिखित अपवाद के साथ दुर्घटनाग्रस्त हो जाती है।

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Couldn't add the Keychain Item.' 
*** First throw call stack: 
(
    0 CoreFoundation      0x01b445e4 __exceptionPreprocess + 180 
    1 libobjc.A.dylib      0x018c78b6 objc_exception_throw + 44 
    2 CoreFoundation      0x01b44448 +[NSException raise:format:arguments:] + 136 
    3 Foundation       0x014a823e -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116 
    4 Feeltracker       0x000053b3 -[KeychainItemWrapper writeToKeychain] + 899 
    5 Feeltracker       0x00004700 -[KeychainItemWrapper setObject:forKey:] + 272 
    6 Feeltracker       0x000092d6 -[FTLoginViewController connectToAccount:] + 374 
    7 libobjc.A.dylib      0x018d9874 - 

कारण क्या हो सकता है? मुझे आश्चर्य है कि क्या इसका उपयोग करने वाले स्थिरांक के साथ इसका कोई संबंध नहीं है।

अद्यतन:

rmaddy की मदद के लिए धन्यवाद:

// No previous item found; add the new one. 
result = SecItemAdd((__bridge CFDictionaryRef)[self dictionaryToSecItemFormat:keychainItemData], NULL); 
NSAssert(result == noErr, @"Couldn't add the Keychain Item."); 

परिणाम -50 पर है:

इस बिट त्रुटि फेंक लगता है। SecItemAdd एक lib विधि है। जैसा कि मैंने उम्मीद कर रहा था, यह किसी भी तरह चाबी का गुच्छा सीधे निपटने से संबंधित है ...

keychainItemData शामिल हैं: enter image description here

+0

किसी भी कोड के बिना आपका क्या मतलब है? क्या आप चाहते हैं कि मैं पूरे रैपर को कॉपी और पेस्ट करें, जिसे मैंने ऊपर से जोड़ा है, फिर से? मैंने आपको बिल्कुल दिखाया है कि मैंने क्या किया है। (इसका ऐप्पल का रैपर, इसकी तीसरी पार्टी नहीं है। दिए गए लिंक पर क्लिक करें, स्पैम पर टिप्पणी करने से पहले) – Houman

+0

दाईज-दंजन, मुझे नहीं पता कि आपको बुरा दिन हो रहा है या आप बस बचपन में काम कर रहे हैं। सबसे पहले आप स्पैम टिप्पणी कर रहे हैं, बिना किसी कारण के आप डाउनवॉटिंग/बंद करना शुरू कर देते हैं, और फिर अपनी खुद की टिप्पणियों को वापस नहीं ढूंढने के लिए हटा दें। यदि आप मदद नहीं करना चाहते हैं, तो यह ठीक है। आप जो करते हैं वह सहायक नहीं है, न ही पेशेवर। – Houman

+0

डीबगर का उपयोग करें और 'SecItemAdd' के वापसी मूल्य को देखें (परिणाम कोड शामिल करने के लिए लॉग स्टेटमेंट अपडेट करें)। फिर "कुंजीपटल आइटम नहीं जोड़ सका" त्रुटि संदेश पर खोजें और एक ही त्रुटि कोड का संदर्भ देने वाले लोगों को ढूंढें। कई संभावित कारण प्रतीत होते हैं। त्रुटि कोड इसे बहुत कम कर देगा। – rmaddy

उत्तर

15

मैं कीचेन आवरण काम के लिए इस एप्पल उदाहरण किसी भी अब नहीं मिल सका। सौभाग्य से इस मामले में आगे के शोध से पता चला कि यह solution है, जो मेरे लिए काम करता है।

समाधान के मूल उत्तर से सावधान रहें ARC'ed नहीं है, हालांकि कोई ARC'ed version on Github बनाने के लिए बहुत दयालु था। मैंने उस का इस्तेमाल किया और एक आकर्षण की तरह काम करता है।

यह चाबी के चारों ओर एक रैपर है, जो मूल की तुलना में भी सरल है।

उम्मीद है कि यह दूसरों को इसी तरह की समस्या से मदद करता है।

+2

जेएनकेचेन ने मेरे लिए बहुत अच्छा काम किया! – malhal

+0

यह समूह – vatti

5

सिम्युलेटर पर ऐप चलाने पर मुझे वही त्रुटि थी, लेकिन यह डिवाइस पर पूरी तरह से काम करता था।

सिम्युलेटर के साथ समस्या को ठीक करने के लिए मुझे "शेयर कीचेन एंटाइटेलमेंट" चालू करना पड़ा।

Share keychain entitlement

+0

का समर्थन करता है मेरे लिए इस मुद्दे को ठीक करने पर इसे चालू करना। धन्यवाद! –

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