2015-01-20 4 views
5

से डेटा पुनर्प्राप्त करते समय त्रुटियों को प्राप्त करने वाले उपयोगकर्ताओं का छोटा प्रतिशत, मेरे पास एक आईओएस ऐप है जो कि कीचेन में एक्सेस टोकन संग्रहीत करता है। पिछले कुछ महीनों में, मैंने देखा है कि टोकन को पुनर्प्राप्त करने का प्रयास करते समय उपयोगकर्ताओं के लगभग 2% उपयोगकर्ताओं को errSecItemNotFound मिलता है।कीचैन

सभी प्रासंगिक स्टैक ओवरफ्लो थ्रेड अपराधी होने के कारण पृष्ठभूमि कार्यों को इंगित करते हैं (iOS KeyChain not retrieving values from background) या क्वेरी स्ट्रिंग (Keychain: Item reported as errSecItemNotFound, but receive errSecDuplicateItem on addition) में अमान्य पैराम सहित।

मैं kSecAttrAccessibleAfterFirstUnlock का उपयोग कर रहा हूं, इसलिए पृष्ठभूमि कार्य केवल कीचैन तक पहुंचने में सक्षम होना चाहिए।

इसके अलावा, खोज प्रश्न इस प्रकार है:

NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; 
[query setObject:(__bridge id)kSecClassGenericPassword forKey:(__bridge id)kSecClass]; 
[query setObject:(__bridge id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; 
[query setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; 
[query setObject:service forKey:(__bridge id)kSecAttrService]; 
[query setObject:key forKey:(__bridge id)kSecAttrGeneric]; 
[query setObject:key forKey:(__bridge id)kSecAttrAccount]; 

(kSecAttrGeneric स्थापना शायद बेमानी है, लेकिन यह क्वेरी के परिणाम वैसे भी प्रभावित नहीं करता है)

रिकॉर्ड के लिए, मैं SSKeyChain और UICKeychainStore दोनों के साथ इस बग का अनुभव किया है।

कोई संकेत अत्यधिक सराहना किया जाएगा:]

+0

हाय !! मैं बेहद एक ही मुद्दा कर रहा हूं ... क्या UICKeyChainStore lib ने हल किया है? धन्यवाद!! – Jovem

उत्तर

4

मैं KDJKeychainItemWrapper उपयोग कर रहा था और इसी तरह के मुद्दों था। अंत में मैंने kSecAttrService का उपयोग करने के लिए kSecAttrGeneric के उपयोग को बदल दिया। यह परिभाषित नहीं होने वाली सेवा के कारण प्रविष्टियों और डुप्लिकेट नहीं ढूंढने के मेरे सभी मुद्दों को ठीक करता है।

मेरा मानना ​​है कि kSecClassGenericPassword के लिए प्राथमिक कुंजी केवल kSecAttrAccount और kSecAttrService हैं।

यदि आप kSecAttrGeneric का उपयोग नहीं करने के लिए आगे बढ़ते हैं तो इसे अपने पासवर्ड को फिर से रखने के लिए स्वयं को सॉर्ट करना चाहिए।

भी एक सेवा नाम चुनें जो किसी और चीज़ के साथ संघर्ष नहीं करेगा।

+0

ध्यान दें कि मैं पहले से ही kSecAttrService का उपयोग कर रहा हूं (kSecAttrService + kSecAttrAccount + kSecAttrGeneric)। अतिरिक्त (और अनावश्यक) kSecAttrGeneric विशेषता को अनदेखा नहीं किया जाना चाहिए? – mgv

+0

कुंजी ऐसा लगता है कि खाता और सेवा एक जोड़ी के रूप में अद्वितीय होना चाहिए। यदि नहीं तो आप उन्हें कहीं और ओवरराइट या हटाए जाने का खतरा चलाते हैं। मैंने नीचे ट्रैक किया जहां मैंने इसे मूल रूप से देखा: http://useyourloaf.com/blog/2010/04/28/keychain-duplicate-item-when-adding-password.html –

+0

हालांकि आप सही हैं हालांकि आप सभी का उपयोग कर रहे हैं 3 और आप AttrGeneric को उसी मान पर सेट कर रहे हैं जैसे AttrAccount को काम करना चाहिए भले ही AttrGeneric को अनदेखा किया जाए। यह देखते हुए कि आपकी त्रुटि नहीं मिली है, यह संकेत दे सकता है कि प्रविष्टि कहीं और बदल दी गई है। क्या AttrService कुंजी के लिए आपका मान एक अच्छा अद्वितीय मूल्य है? किसी भी तरह से यह अद्यतन होने पर कहने या दूषित होने पर सेट हो सकता है जिसके परिणामस्वरूप अगली बार इसकी पूछताछ विफल हो जाएगी? –

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

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