इस मामले से अवगत रहें, जब आपका ऐप पृष्ठभूमि में चल रहा है और आप अपने संग्रहीत मूल्यों को NSUserDefaults में एक्सेस नहीं कर सकते हैं:
इस बारे में कई सूत्र और बग रहे हैं, लेकिन यह ios 9 में फिर से मेरे साथ हो रहा है। मेरे पास एक ऐप है जो पृष्ठभूमि में NSURLSession कार्यों और सामग्री-उपलब्ध पुश के जवाब में लॉन्च करता है। Reproducibly, अगर मैं अपने फोन को रिबूट करता हूं और अपने ऐप के बैकग्राउंड लॉन्च होने की प्रतीक्षा करता हूं, तो जब मैं ऐप खोलता हूं तो मुझे पता चलता है कि [[NSUserDefaults standardUserDefaults] DictionaryRepresentation में सभी सिस्टम मान हैं, जैसे AppleITunesStoreItemKinds, आदि लेकिन इसमें कुछ भी शामिल नहीं है। मैंने जो भी मूल्य निर्धारित किए हैं। अगर मैं बल छोड़ता हूं और ऐप को पुनः लॉन्च करता हूं तो मेरे सभी मूल्य वापस आ जाते हैं। क्या फोन को अनलॉक करने से पहले "खाली" मानकयूसेरडेफ़लस को कैशिंग करने से बचने का कोई तरीका है, या कम से कम यह निर्धारित करने के लिए कि उन्हें गड़बड़ करने और ऐप को मजबूर करने के बिना उन्हें ठीक करना है?
यहां समस्या यह है कि NSUserDefaults अंततः आपके ऐप के कंटेनर में एक फ़ाइल द्वारा समर्थित है और आपके ऐप का कंटेनर डेटा सुरक्षा के अधीन है। यदि आप कुछ खास नहीं करते हैं, तो iOS 7 और बाद में, आपका कंटेनर NSFileProtectionCompleteUntilFirstUserAuthentication का उपयोग करता है, जो कि NSUserDefaults बैकिंग स्टोर द्वारा विरासत में मिला है, और इसलिए पहले अनलॉक करने से पहले इसे एक्सेस नहीं किया जा सकता है।
IMO इसके लिए सबसे अच्छा तरीका है कि आप सामान के लिए NSUserDefaults से बचें जो आप कोड पथों पर भरोसा करते हैं जो पृष्ठभूमि में निष्पादित कर सकते हैं। इसके बजाय उन सेटिंग्स को अपनी वरीयताओं की फ़ाइल में संग्रहीत करें, जिनकी डेटा सुरक्षा आप स्पष्ट रूप से प्रबंधित कर सकते हैं (इस मामले में जिसका अर्थ है 'NSFileProtectionNone पर सेट')।
डेटा सुरक्षा के संदर्भ में NSUserDefaults के साथ दो समस्याएं हैं:
इसका पूरी तरह से अमूर्त API: इसके बैकिंग स्टोर की उपस्थिति और स्थान को उस API का हिस्सा नहीं माना जाता है, इसलिए आप अपनी डेटा सुरक्षा को स्पष्ट रूप से प्रबंधित नहीं कर सकते हैं।
नोट OS X के हाल के संस्करणों में NSUserDefaults एक डेमन और लोगों द्वारा प्रबंधित किया जाता है जो सीधे इसके बैकिंग स्टोर में हेरफेर करने का प्रयास करते हैं जो समस्याओं में भाग लेते हैं। कुछ समय में iOS पर एक ही तरह की चीज की कल्पना करना आसान है।
यदि डेटा सुरक्षा बदलना संभव हो, तब भी NSUserDefaults में उस संदर्भ के आधार पर डेटा को वर्गीकृत करने की कोई व्यवस्था नहीं है, जिसमें आप इसका उपयोग कर रहे हैं; यह एक 'सब या कुछ नहीं' एपीआई है। आपके मामले में आप अपने सभी उपयोगकर्ता डिफॉल्ट्स से सुरक्षा को दूर नहीं करना चाहते हैं, बस आपको पहले अनलॉक करने से पहले बैकग्राउंड में पहुंचना होगा।
अंत में, यदि इस डेटा में से कोई भी वास्तव में संवेदनशील है, तो आपको इसे किचेन में रखना चाहिए। विशेष रूप से, किचेन में आइटम-दर-आइटम आधार पर डेटा सुरक्षा सेट करने की क्षमता होती है।