क्या NSUserDefaults एपस्टोर में एक ऐप के लिए अपडेट के माध्यम से बना रहता है?


106

क्या यह मामला है? जब आप ऐप स्टोर पर किसी ऐप को अपडेट सबमिट करते हैं, या क्या वे रीसेट होते हैं, तो क्या NSUserDefaults रीसेट हो जाता है?

अपडेट होने पर मेरा ऐप क्रैश हो रहा है लेकिन पूरी तरह से डाउनलोड होने पर क्रैश नहीं हो रहा है - इसलिए मैं यह निर्धारित करने की कोशिश कर रहा हूं कि अपडेट किए गए सत्र में संभवतः नए डाउनलोड किए गए सत्र में क्या अलग हो सकता है।

चीयर्स, निक।


दस्तावेज़ और लाइब्रेरी में मौजूद फाइलों को दस्तावेज़ीकरण के दावों के रूप में संरक्षित किया जाएगा : developer.apple.com/library/ios/#DOCUMENTATION/iPhone/…
Geri Borbás

जवाबों:


116

जब तक उपयोगकर्ता एप्लिकेशन को हटा नहीं देता, वे आमतौर पर रीसेट नहीं होते हैं। बुनियादी डेटा के लिए, NSUserDefaults वरीयताओं, तिथियों, तारों आदि जैसे डेटा को बचाने का सबसे अच्छा तरीका है। यदि आप छवियों और फ़ाइलों को सहेजना चाहते हैं, तो फ़ाइल सिस्टम एक बेहतर शर्त है।


5
कहीं Apple प्रलेखन में यह उल्लेख किया गया है?
निक कार्टराइट

1
क्षमा करें - मैं आपके त्वरित उत्तर के लिए धन्यवाद देना भूल गया! - अगर कोई भी किसी भी ऐप्पल डॉक्यूमेंटेशन के किसी भी रूप का लिंक पा सकता है जो यह कहता है, तो यह बहुत अच्छा होगा .... NSUserDefaults के लिए डॉक्यूमेंटेशन में इस बारे में कुछ नहीं कहा गया है, इसलिए मुझे लगता है कि मैंने (गलत तरीके से) यह मान लिया था कि डिफॉल्ट हो गए हैं। यह निश्चित रूप से ऐप्स को अपडेट करने के लिए Apple का सबसे सुरक्षित तरीका प्रतीत होगा!
निक कार्टराइट

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

1
दस्तावेज़ फ़ोल्डर में डेटा केवल NSUserDefaults की तरह आसानी से गायब हो सकता है। हालांकि, वे दोनों दुर्लभ अवसर हैं, और सामान्य उन्नयन प्रक्रिया के साथ कुछ भी नहीं करना है
coneybeare

1
धन्यवाद क्रिस्टोफर - और हाँ मैं सहमत हूँ। मेरी समस्या यह थी कि मैंने प्रोग्राम कार्यक्रमों को संग्रहीत करने के लिए NSUserDefaults का उपयोग किया था और ऐप के इंस्टॉल होने पर उन्हें रीसेट किए जाने पर भरोसा किया था। IPhone डिवाइस (और एपल्स टेस्टिंग) पर मेरे सभी परीक्षण ने ऐप को एक नए इंस्टॉल के रूप में परीक्षण किया। किसी भी दस्तावेज या अपडेट के बिना परीक्षण के तरीके के बिना मैं अपडेट क्रैश को दोहराने में असमर्थ था हमारे सभी ग्राहक अब अनुभव कर रहे हैं। योग करने के लिए - शायद एक सबक कठिन तरीका सीखा !!
निक कार्टराइट

7

मुझे लगता है कि उत्तर हां है, यह जारी रहेगा। यह Apple iPhone OS प्रोग्रामिंग गाइड में एप्लिकेशन डायरेक्टरी चैप्टर के तहत पूरी तरह से प्रलेखित है।


4
  1. पोस्ट किए गए प्रश्न का सीधा उत्तर: हाँ।
  2. आपकी समस्या: तर्क समस्याओं के कारण आपका ऐप क्रैश हो गया है। मान लीजिए कि आप किसी ऑब्जेक्ट को डिफॉल्ट में स्टोर करते हैं और ऐप लॉन्च पर (या कहीं और) उसका मूल्य चेक करता है। आपके द्वारा अपडेट किए जाने पर आप उस तरीके को बदल सकते हैं जिसका उपयोग किया जाता है या उपयोग किया जाता है, जैसे कि आप एक मूल्य की अपेक्षा करते हैं, लेकिन वस्तु शून्य है, या इसके विपरीत। इसके कारण SIGABRT या EXC_BAD_ACCESS हो सकता है।

2

यदि आपके पास CoreData मॉडल था और आपने अपने मॉडल और अपडेट में कुछ बदल दिया, तो माइग्रेशन को प्रबंधित किए बिना, शायद यही कारण है कि आपका ऐप अपडेट होने पर क्रैश हो जाता है ...


मुझे उम्मीद है कि यह एक मामला हो सकता है :) नहीं एक NSUserdefault
जूलियन Król

1

मेरा भी ऐसा ही अनुभव है। हमारा ऐप सेटिंग्स में एक संस्करण संख्या संग्रहीत करता है। Bundle / Root.Plist। यह iPhone सेटिंग्स ऐप के माध्यम से प्रदर्शित होता है। हम पाते हैं कि इंस्टॉल पर वर्जन नंबर एप बंडल से लोड हो जाता है - इसलिए वर्जन नंबर सही है। एक अद्यतन पर हालांकि संस्करण संख्या नहीं बदलती है। इससे यह आभास होता है कि उपयोगकर्ता ऐप का पिछला संस्करण चला रहा है। हमारे पास संस्करण संख्या से जुड़ा कोई तर्क नहीं है, यह सिर्फ प्रदर्शन के लिए है (यह दोष का निदान करते समय संपर्क केंद्र के कर्मचारियों द्वारा इस्तेमाल किया जा सकता है)।

जब हमारा उपयोगकर्ता हमारे ऐप को अपडेट करता है, तो हमारा अनुभव NSUserDefaults साफ़ नहीं होता है, लेकिन सेटिंग डिस्प्ले अपडेट नहीं किया जाता है।


0

इस मामले से अवगत रहें, जब आपका ऐप पृष्ठभूमि में चल रहा है और आप अपने संग्रहीत मूल्यों को NSUserDefaults में एक्सेस नहीं कर सकते हैं:

एरिक:

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

एस्किमो (eskimo1@apple.com):

यहां समस्या यह है कि NSUserDefaults अंततः आपके ऐप के कंटेनर में एक फ़ाइल द्वारा समर्थित है और आपके ऐप का कंटेनर डेटा सुरक्षा के अधीन है। यदि आप कुछ खास नहीं करते हैं, तो iOS 7 और बाद में, आपका कंटेनर NSFileProtectionCompleteUntilFirstUserAuthentication का उपयोग करता है, जो कि NSUserDefaults बैकिंग स्टोर द्वारा विरासत में मिला है, और इसलिए पहले अनलॉक करने से पहले इसे एक्सेस नहीं किया जा सकता है।

IMO इसके लिए सबसे अच्छा तरीका है कि आप सामान के लिए NSUserDefaults से बचें जो आप कोड पथों पर भरोसा करते हैं जो पृष्ठभूमि में निष्पादित कर सकते हैं। इसके बजाय उन सेटिंग्स को अपनी वरीयताओं की फ़ाइल में संग्रहीत करें, जिनकी डेटा सुरक्षा आप स्पष्ट रूप से प्रबंधित कर सकते हैं (इस मामले में जिसका अर्थ है 'NSFileProtectionNone पर सेट')।

डेटा सुरक्षा के संदर्भ में NSUserDefaults के साथ दो समस्याएं हैं:

इसका पूरी तरह से अमूर्त API: इसके बैकिंग स्टोर की उपस्थिति और स्थान को उस API का हिस्सा नहीं माना जाता है, इसलिए आप अपनी डेटा सुरक्षा को स्पष्ट रूप से प्रबंधित नहीं कर सकते हैं।

नोट OS X के हाल के संस्करणों में NSUserDefaults एक डेमन और लोगों द्वारा प्रबंधित किया जाता है जो सीधे इसके बैकिंग स्टोर में हेरफेर करने का प्रयास करते हैं जो समस्याओं में भाग लेते हैं। कुछ समय में iOS पर एक ही तरह की चीज की कल्पना करना आसान है।

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

अंत में, यदि इस डेटा में से कोई भी वास्तव में संवेदनशील है, तो आपको इसे किचेन में रखना चाहिए। विशेष रूप से, किचेन में आइटम-दर-आइटम आधार पर डेटा सुरक्षा सेट करने की क्षमता होती है।

स्रोत: https://webcache.googleusercontent.com/search?q=cache:sR9eZNHpZtwJ:https://forums.developer.apple.com/thread/15685

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.