सिम्युलेटर पर ऐप अनइंस्टॉल करने के बाद NSUserDefaults साफ़ नहीं हुआ


95

यह वास्तविक ध्वनि लग सकता है! मैं यह जांचना चाहता हूं कि क्या यह दूसरी बार है जब उपयोगकर्ता मेरे आवेदन में प्रवेश करता है, इसलिए मैं जो रन का उपयोग कर रहा हूं उसे रखने के लिए NSUserDefaults। मैं अपने में निम्न कोड को लागू किया है rootViewControllerकी viewDidLoadविधि:

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

    if ([userDefaults integerForKey:@"runCount"] != 1) {
        //not the 2nd run
        [userDefaults setInteger:1 forKey:@"runCount"];
        NSLog(@"not 2nd run");
    } else {
        //second run or more
        NSLog(@"2nd run");
    }

    [userDefaults synchronize];

सब कुछ ठीक काम करता है, लेकिन समस्या यह है कि जब मैं यहां और यहां डेटा के अनुसार एप्लिकेशन को अनइंस्टॉल (डिलीट और री-इंस्टॉल) करता हूं , तो डेटा क्लियर होना चाहिए, लेकिन यह नहीं है और ऐप को री-इंस्टॉल करने के बाद पिछला डेटा अभी भी दिख रहा है। मैं xcode6- बीटा का उपयोग करके iOS सिम्युलेटर पर अपना ऐप चला रहा हूं और iOS 8 पर एप्लिकेशन को लक्षित कर रहा हूं


2
क्या आपने वास्तविक डिवाइस पर परीक्षण करने की कोशिश की है?
हेनरी एफ

आपको इसे सिम्युलेटर पर मैन्युअल रूप से साफ़ करना होगा। यहाँ है कैसे
dasblinkenlight

कृपया सही जवाब निशान तो इस सवाल का अब कोई उत्तर नहीं दिया गया
ऐन्डर्स

1
@ रेज़ा: [[NSUserDefaults standardUserDefaults] setObject: selectLists forKey: UserID]। मेरा ऐप यहां ios8 में क्रैश हो गया है, हालांकि ios6 और ios7 में ठीक काम करता है। यहाँ के selectedlists NSMutable सरणी में और प्रयोक्ता-आईडी एक स्ट्रिंग है।
मंथन

@ मंथन यह कुछ अलग मुद्दा है, लेकिन मुझे कहीं और एक ही समस्या का सामना करना पड़ा है और इसका कारण यह है कि दुर्घटना का कारण था, हालांकि जिस वस्तु को मैं किसी कुंजी के लिए सहेज रहा था, NSMutableArrayवह एक के रूप में सहेजा गया था NSArrayऔर इसे बदलने से मेरा ऐप क्रैश हो गया। .. मैं बचत एक सलाह देते हैं NSArrayजब आप इसे बाद में उपयोग करने के लिए करने के लिए इसे कास्टिंग चाहते हैं और NSMutableArrayका उपयोग कर [NSMutableArray arrayWithArray:array];। मुझे आशा है कि वह मदद करेंगे।
रेज़ा शाइस्तेहोर

जवाबों:


169

मुझे लगता है कि यह iOS8 बीटा सिम्युलेटर में एक बग के कारण है।

अपेक्षित व्यवहार यह है कि जब एप्लिकेशन को हटा दिया जाता है, तो उस ऐप के लिए NSUserDefaults भी हटा दिया जाता है।

  • हालाँकि, जब आप सिम्युलेटर से कोई ऐप हटाते हैं तो NSUserDefaults हटाए नहीं जाते हैं ।
  • जब आप iOS8 पर चलने वाले भौतिक उपकरण से हटाते हैं, तो वे सही ढंग से हटा दिए जाते हैं।

अब के लिए एक त्वरित और कष्टप्रद समाधान क्लिक करना है, आईओएस सिम्युलेटर -> सामग्री और सेटिंग्स रीसेट करें।

सिम्युलेटर 10 के साथ Xcode 9.2 अभी भी इस मुद्दे को प्रस्तुत करता है। मेनू विकल्प अब हार्डवेयर है .. सभी सामग्री और सेटिंग्स मिटा दें

मैंने बग रिपोर्ट btw प्रस्तुत की


45
आईओएस 8 जीएम पर इसका परीक्षण किया गया और बग अभी भी मौजूद है। बहुत कष्टप्रद।
मैनफ्रेड शेहिनर सेप

1
मैं Xcode 6 GM सिम्युलेटर और iOS 8 (12A365) में इस छोटी गाड़ी के व्यवहार की पुष्टि कर सकता हूं!
बोरिस ब्रदरिक

1
मौजूदा खुला रडार लिंक जो मामले का पालन करना चाहता है के लिए: openradar.appspot.com/18540702
viggio24

1
XCode 6.1 (6A1052d) के अपडेट के बाद बग दिखने में SDK 8.1 पर तय होता है
kas-kad

2
किसी के लिए भी इसी मुद्दे का सामना करना पड़ रहा है। यदि आपके पास एक ही समूह के अंतर्गत 1 से अधिक ऐप हैं और वे सभी ऐप समूह (क्षमताओं के तहत चालू) का उपयोग कर रहे हैं, तो आपको उपयोगकर्ता की चूक साफ़ करने के लिए डिवाइस से सभी ऐप को हटाना होगा। चूंकि उपयोगकर्ता डिफॉल्ट्स साझा किए जाते हैं, भले ही ऐप में से कोई एक डिवाइस पर हो, तो उसे हटाया नहीं जाएगा, क्योंकि वह ऐप यूज़रडेफ़ॉल्ट्स का उपयोग कर रहा होगा।
अंकित श्रीवास्तव

14

चूंकि रीसेट सामग्री और सेटिंग्स एक परमाणु विकल्प है, आप दो अन्य विकल्पों पर विचार कर सकते हैं जब तक कि आईओएस 8 / एक्सकोड 6 जीएम पर बग को संबोधित नहीं किया जाता है:

  1. आप मैन्युअल रूप से प्लिस्ट फ़ाइल को हटा सकते NSUserDefaultsहैं जहां संग्रहीत हैं। यह वर्तमान ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist में UUID निर्देशिका नामों के साथ काम करने के लिए सही सिम्युलेटर खोजने के लिए थोड़ा थकाऊ है। EDIT : 2014-10-28 20-34-52 सही रास्ता: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. आप उस प्लिस्ट पर "सर्जरी" कर सकते हैं (एक रन स्क्रिप्ट बिल्ड चरण का उपयोग करके) प्लिस्टबड्डी उदाहरण के लिए

/usr/libexec/plistbuddy -c "Set :BSDidMoveSqliteDb 0" path_to_plist


आप गायब हैं / डेटा / / के बाद / * some_device_id * /
dude

5

किसी के लिए भी इसी मुद्दे का सामना करना पड़ रहा है।

यदि आपके पास एक ही समूह के अंतर्गत 1 से अधिक ऐप हैं और वे सभी ऐप समूह (क्षमताओं के तहत चालू) का उपयोग कर रहे हैं, तो आपको उपयोगकर्ता की चूक साफ़ करने के लिए डिवाइस से सभी ऐप को हटाना होगा।

चूंकि उपयोगकर्ता डिफॉल्ट्स साझा किए जाते हैं, भले ही ऐप में से कोई एक डिवाइस पर हो, तो उसे हटाया नहीं जाएगा, क्योंकि वह ऐप यूज़रडेफ़ॉल्ट्स का उपयोग कर रहा होगा।


4

कोड को डिवाइस पर ठीक काम करना चाहिए। शायद सिम्युलेटर में कुछ कीड़े।

सिम्युलेटर के लिए सामग्री और सेटिंग्स रीसेट करने का प्रयास करें।


1
सामग्री और सेटिंग्स रीसेट करना ठीक काम करता है, और मेरे पास जाँच के लिए फिलहाल कोई उपकरण नहीं है। tnx :)
रेज़ा शाइस्टहॉपर

4

यह एक बग है, और आप निम्नलिखित कोड के साथ NSUserDefaults हटा सकते हैं

 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

2

हालांकि यह अभी भी एक बग है और दूसरा विकल्प NSUserDefaults में विशिष्ट कुंजी (एस) को हटाने के लिए हो सकता है। अधिकांश समय, जब परीक्षण / विकास करते हैं, हम केवल कुछ कुंजी के बारे में परवाह करते हैं और एनएसयूसेडरफॉल्ट्स में सब कुछ नहीं। यदि आप केवल कुछ कुंजियों के बारे में परवाह करते हैं, तो मैं जोड़ देता हूं removeObjectForKey:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// ADD THIS TO SIMULATE CLEAN/EMPTY DEFAULTS, COMMENT OUT AFTER INITIAL EXECUTION.
// This will cause the TRUE case to be executed.
[userDefaults removeObjectForKey:@"runCount"]

NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

if ([userDefaults integerForKey:@"runCount"] != 1) {
    //not the 2nd run
    [userDefaults setInteger:1 forKey:@"runCount"];
    NSLog(@"not 2nd run");
} else {
    //second run or more
    NSLog(@"2nd run");
}

[userDefaults synchronize];

जोड़ा जा रहा है removeObjectForKeysimulates अनुप्रयोग के पहली बार चलाने, यह पता टिप्पणी बाद के सभी एप्लिकेशन फांसी अनुकरण करेंगे।


2

मेरे मामले में मैंने निम्नलिखित निर्देशिका में * .plist पाया:

[1] / उपयोगकर्ताओं / कुछ-USERNAME / Library / डेवलपर / CoreSimulator / उपकरण / कुछ-डिवाइस आईडी /data/Library/Preferences/SP.UserDefaultsTest.plist

समस्या: xCode 6 (iOS 8 सिम्युलेटर) में एप्लिकेशन को हटाना लेकिन फ़ाइल ऊपर बताए अनुसार डिस्क पर रहती है।

समाधान: पथ से स्थित फ़ाइल को हटाना [1] मैन्युअल रूप से और NSUserDefaults चला गया है।

तो सिम्युलेटर को रीसेट करने का कष्टप्रद तरीका अब आवश्यक नहीं है।

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