iOS कीचिन बैकग्राउंड से वैल्यू को रिकवर नहीं कर रहा है


85

मैं वर्तमान में उपयोगकर्ता नाम (ईमेल) और iOS कीचेन में ईमेल और पासवर्ड का नमकीन हैश स्टोर कर रहा हूं। मैं यहां पाए गए ARC'ified संस्करण का उपयोग कर रहा हूं ।

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
[wrapper setObject:APP_NAME forKey:(__bridge id)kSecAttrService];
[wrapper setObject:email forKey:(__bridge id)kSecAttrAccount];
[wrapper setObject:token forKey:(__bridge id)kSecValueData];

यह सब ठीक काम करता है जब मुझे ऐप सक्रिय होने के दौरान अपने नेटवर्क कॉल के लिए टोकन बाहर खींचने की आवश्यकता होती है। यह एक स्वच्छ स्टार्टअप से प्रवेश करने के लिए काम करता है, साथ ही साथ सभी नेटवर्क कॉल पूरे भर में करता है। मुसीबत तब शुरू होती है जब ऐप बैकग्राउंड में होता है।

ध्यान रखें, यह केवल छिटपुट रूप से होता है और मुझे इसे अभी तक एक विशिष्ट iOS संस्करण या डिवाइस पर पिन करना है।

उपयोगकर्ता एक स्थान (क्षेत्र की निगरानी) का दौरा करता है और मैं सर्वर को उनकी स्थिति के साथ अद्यतन करना चाहता हूं। मैं किचेन से टोकन खींचने की कोशिश करता हूं, उसी तरह मैं हर दूसरे नेटवर्क कॉल के लिए करता हूं, और स्टेटस अपडेट करता हूं। लेकिन कुछ उपयोगकर्ताओं के लिए, मान शून्य है। इसके बिना, मैं नेटवर्क सामग्री को अपडेट नहीं कर सकता। यह काम अधिकांश के लिए क्यों होगा, लेकिन एक छोटे प्रतिशत के लिए नहीं?

KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"MyCustomIdentifier" accessGroup:nil];
NSString *token = [wrapper objectForKey:(__bridge id)kSecValueData];

मैं keychainwrapper के गैर-एआरसी संस्करण पर वापस गया हूं, लेकिन मुझे अभी भी वही परिणाम मिलते हैं। मैं इस पर किसी भी प्रतिक्रिया की सराहना करता हूं। यह मेरे उपयोगकर्ताओं का एक छोटा सा हिस्सा है, लेकिन यह एक ऐसा मुद्दा है जिसे मैं ठीक करना चाहता हूं और इसके बारे में चिंता नहीं करना चाहिए। अग्रिम में धन्यवाद।

इसके अलावा, मेरे सभी बैकग्राउंड वर्क को टाइम आउट से चीजों को रोकने के लिए एक बैकग्राउंड में सेट किया गया है। मुझे किचेन के आस-पास के काम से कोई समस्या नहीं है, लेकिन मैं तब तक चीजों को आगे नहीं बढ़ने देता जब तक कि मेरा टोकन नहीं भर जाता।

संपादित करें, मैंने अपने मुद्दे का पता लगा लिया है क्योंकि वे कीचेन पृष्ठभूमि से मूल्यों को प्राप्त नहीं कर रहे हैं। मैं नीचे दिए गए उत्तर को पोस्ट करूँगा और इसे स्वीकार कर लूंगा क्योंकि मुझे लगता है कि यह प्रश्न बाद में दूसरों के लिए मूल्यवान हो सकता है।

जवाबों:


110

मेरा प्रश्न इस कारण से निशान के करीब था, लेकिन काफी नहीं। ब्लॉग के बाद ब्लॉग के माध्यम से पढ़ने के बाद, ट्यूटोरियल के बाद ट्यूटोरियल, मैंने आखिरकार एक पाया जो कि हो रहा है का एक संकेत दिया।

बंद घर स्क्रीन। किचेन ट्यूटोरियल ने हमेशा किचेन ब्लैंक के लिए एक्सेसिबिलिटी सेटिंग्स को छोड़ दिया, इसलिए यह ऐप्पल के सबसे निचले / सबसे सुरक्षित एक्सेस लेवल को डिफॉल्ट करेगा। यदि उपयोगकर्ता लॉक स्क्रीन पर पासकोड रखता है तो यह स्तर किचेन एक्सेस की अनुमति नहीं देता है। बिंगो! यह छिटपुट व्यवहार की व्याख्या करता है और ऐसा केवल कुछ प्रतिशत उपयोगकर्ताओं के लिए ही क्यों होता है।

कोड की एक पंक्ति, संपूर्ण गड़बड़ हल करती है।

[wrapper setObject:(__bridge id)kSecAttrAccessibleAlways forKey:(__bridge id)kSecAttrAccessible];

इस पंक्ति को जोड़ें जहां मैं उपयोगकर्ता नाम और पासवर्ड मान सेट कर रहा हूं। एक जादू की तरह काम करता है। आशा है कि यह किसी को वहाँ से बाहर निकलने में मदद करेगा। इसने मुझे काफी देर तक भ्रमित किया जब तक कि मैं टुकड़ों को एक साथ रखने में सक्षम नहीं हो गया।


1
धन्यवाद! यह बहुत मददगार था।
रिच वाटर्स

3
हम वास्तव में हफ्तों से इससे निपट रहे हैं। तुम एक जीवन रक्षक हो!
OC रिकार्ड

15
कृपया …AccessibleAlwaysयदि संभव हो तो बचें या एक टोकन स्टोर करें जो केवल सीमित विशेषाधिकार प्रदान करता है (उदाहरण के लिए एक टोकन जो आपको नए फ़ीड आइटम के लिए पढ़ने की अनुमति देता है लेकिन पोस्ट नहीं)। आप स्पष्ट रूप से ऐसा करके एन्क्रिप्शन के एक स्तर पर जा रहे हैं। यदि आपका ऐप पहले अनलॉक होने तक प्रतीक्षा कर सकता है, तो संभवतः …AfterFirstUnlockअपने उपयोगकर्ताओं को पहले अपने डिवाइस को अनलॉक करने के लिए उपयोग करना और निर्देशित करना सबसे अच्छा होगा ।
मिलेनियम

14
यह वास्तव में बुरा विचार है क्योंकि इसका मतलब है कि यह क्रेडेंशियल डेटा अब संरक्षित नहीं है। थोड़ा और काम करते समय, एक व्युत्पन्न साख बनाना महत्वपूर्ण है, जिसका उपयोग केवल उस सीमित पहुंच के लिए किया जा सकता है जिसकी आपको पृष्ठभूमि में आवश्यकता होती है और इससे अधिक नहीं। उस सीमित क्रेडेंशियल को कुछ समय के बाद समाप्त किया जा सकता है, और एक नया हर बार ऐप को खोला जाता है, जो पुराने को अमान्य करता है। यह व्युत्पन्न साख से छेड़छाड़ होने की स्थिति में उपयोगकर्ता को सुरक्षित रखता है। इसके बारे में सुनने के लिए डब्ल्यूडब्ल्यूडीसी 2013 सत्र 204 देखें।
जॉय हेजोर्न

7
यहाँ पर @JoeyHagedorn गूँज रहा है - WWDC 2013 सत्र 204 को सुनें "क्या नया है मल्टीटास्किंग के साथ" 44:24 मार्क पर और WWDC 2013 सत्र 709 "प्रोटेक्टिंग सीक्रेट्स विद द किचेन" 25 वें मार्क पर। आप इन वार्ताओं की पाठ्य सामग्री को asciiwwdc.com
Shazron

63

के kSecAttrAccessibleAfterFirstUnlockबजाय का उपयोग करें kSecAttrAccessibleAlways


से एप्पल के प्रलेखन :

kSecAttrAccessibleAfterFirstUnlock
किचेन आइटम में डेटा को पुनरारंभ नहीं किया जा सकता है जब तक कि डिवाइस को उपयोगकर्ता द्वारा एक बार अनलॉक नहीं किया गया हो।

पहले अनलॉक के बाद, डेटा अगले पुनरारंभ तक पहुंच योग्य रहता है। यह उन आइटमों के लिए अनुशंसित है जिन्हें पृष्ठभूमि अनुप्रयोगों द्वारा एक्सेस करने की आवश्यकता है। इस विशेषता के साथ आइटम एन्क्रिप्टेड बैकअप का उपयोग करते समय एक नए डिवाइस पर माइग्रेट करते हैं।


4
यह उत्तर एक टिप्पणी होना चाहिए ...
फ्रेज़लाब

यह उत्तर सही लगता है क्योंकि kSecAttrAccessibleAlwaysपहले से ही पदावनत है
सज्जाद हिसैन खान

1

मेरे मामले में, watchOS2 iOS की ओर किचेन डेटा एक्सेस करता है।

शुरुआत में, kSecAttrAccessibleWhenUnlockedThisDeviceOnly का उपयोग किया जाता है। मैं डेटा पढ़ सकता हूं, कोई बात नहीं कि iPhone लॉक है या नहीं। यह मेरे लिए बहुत भ्रामक है कि मैं त्रुटि प्राप्त करूंगा जब घड़ी चाबी का गुच्छा तक पहुंचने की कोशिश कर रही है:: SecTrustEvaluate [पत्ती जारीकर्ताकॉमननाम विषय विषयक नाम]

और कुछ मामला यह बन जाएगा:: SecOSStatusWith त्रुटि: [- 25308] त्रुटि डोमेन = NSOSStatusErrorDomain कोड = -25308 "ks_crypt: e00002e2 'oe' आइटम (कक्षा 6, बैग: 0) में विफल रहा है, जबकि किचेन बंद है। " UserInfo = {NSDescription = ks_crypt: e00002e2 'oe' आइटम में विफल रहा (वर्ग 6, बैग: 0) आइटम का उपयोग करने का प्रयास किया गया, जबकि किचेन बंद है। "

यदि मुझे अधिक जानकारी मिलती है तो मैं अपने उत्तर को अपडेट करूंगा।


0

यह एपल्स डेटा सुरक्षा नीति के कारण हो सकता है जो डेवलपर्स के दृष्टिकोण से कुछ स्तर पर अस्पष्ट है। वर्कअराउंड तब होता है जब एप की लॉन्च की गई जांच हो कि किचेन एक्सेस योग्य है या नहीं, अगर एक्सेस नहीं है तो आप अपने ऐप के प्रकारों के आधार पर अपने ऐप (उचित पॉपअप के साथ) को मार सकते हैं।

+(BOOL) isKeychainAccessible
{
    NSString *keychainTestKey = @"keychainTestKey";
    NSString *keychainTestValue = @"keychainTestValue";
    [self createKeychainValue:keychainTestValue forIdentifier:keychainTestKey];
    NSString *loadedValue = [self keychainStringFromMatchingIdentifier:keychainTestKey];
    [self deleteItemFromKeychainWithIdentifier:keychainTestKey];
    return ([keychainTestValue isEqualToString: loadedValue]);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.