2013-09-22 11 views
5

पर समाप्त हो जाता है तो NSUserDefaults को सहेजने का सही तरीका क्या है जब मुझे अपना ऐप पूरी तरह से आईओएस में छोड़ दिया जाता है तो मुझे अपने NSUserDefault को सहेजने की आवश्यकता होती है। didenterbackground और foreground नहीं। केवल जब उपयोगकर्ता आईओएस में ऋण (-) साइन के साथ अपना ऐप मारता है।जब मेरा ऐप आईओएस

तो मैं AppDelegate के applicationWillTerminate में निम्नलिखित कोड लिखता हूं।

- (void)applicationWillTerminate:(UIApplication *)application 
{ 

    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"iCloud"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

लेकिन यह NSUserDefault पर सहेजता नहीं है।

तो मुझे अपना डेटा सहेजने के लिए कहां लिखना चाहिए?

+0

आप 'कार्यान्वित applicationDidEnterBackground है:'? क्या इसे 'आवेदन के बजाय बुलाया जा सकता है:'? – bneely

+0

हां, यह तब सहेजा जाता है जब मेरा ऐप चल रहा है। जब मैं पूरी तरह से अपने ऐप से बाहर निकलता हूं तो मैं केवल सहेजना चाहता हूं। –

+0

यह गलत दृष्टिकोण है। पृष्ठभूमि में प्रवेश करने पर ऐसा क्यों नहीं करते? – jrturton

उत्तर

2

Apple Doc से:

क्षुधा है कि पृष्ठभूमि निष्पादन का समर्थन नहीं करते या iOS 3.x या के खिलाफ जुड़े हुए हैं के लिए पहले, इस विधि हमेशा कहा जाता है उपयोगकर्ता एप्लिकेशन छोड़ देता है। पृष्ठभूमि निष्पादन का समर्थन करने वाले ऐप्स के लिए, यह विधि आमतौर पर तब नहीं कहा जाता है जब उपयोगकर्ता ऐप छोड़ देता है क्योंकि ऐप बस उस स्थिति में पृष्ठभूमि में जाता है। हालांकि, यह विधि को उन परिस्थितियों में बुलाया जा सकता है जहां ऐप पृष्ठभूमि (निलंबित नहीं) में चल रहा है और सिस्टम को किसी कारण से इसे समाप्त करने की आवश्यकता है।

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

आप UIApplicationExitsOnSuspend का उपयोग यह निर्दिष्ट करने के लिए कर सकते हैं कि ऐप को छोड़ने पर पृष्ठभूमि में स्थानांतरित करने के बजाय समाप्त किया जाना चाहिए।

मुझे डर है, वहाँ किसी भी प्रतिनिधि विधि है जो असभ्य एप्लिकेशन के बल काफी परिदृश्य संभाल लेंगे नहीं है।

आशा है कि यह आपकी समस्या को हल करने में आपकी मदद कर सकता है।

1

समस्या यह है कि applicationWillTerminate बिल्कुल भी नहीं बुलाया जा रहा है।

नीचे दिए गए applicationDidEnterBackground को बदलें और 20 सेकंड के भीतर अपना आवेदन मार दें। आप देख सकते हैं applicationWillTerminate & बुलाया हो रही NSUserDefaults

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 

    __block UIBackgroundTaskIdentifier identifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     if (identifier != UIBackgroundTaskInvalid) { 
      [[UIApplication sharedApplication] endBackgroundTask:identifier]; 
      identifier = UIBackgroundTaskInvalid; 
     } 
    }]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     for (int i=0; i < 20; i++) { 
      NSLog(@"%d", i); 
      sleep(1); 
     } 
     if (identifier != UIBackgroundTaskInvalid) { 
      [[UIApplication sharedApplication] endBackgroundTask:identifier]; 
      identifier = UIBackgroundTaskInvalid; 
     } 
    }); 
} 
2

कोई एप्लिकेशन मल्टीटास्किंग पट्टी से समाप्त हो गया है जब में ठीक से अपने iCloud मान सेट, बस मार दिया जाता है है। नामक कोई प्रतिनिधि विधि नहीं है। willTerminate उन ऐप्स के लिए बुलाया जाता है जो होम बटन हिट होने पर मल्टीटास्किंग का समर्थन नहीं करते हैं।

Apps का डिफ़ॉल्ट समर्थन मल्टीटास्किंग से है, तो आप सब कुछ करना चाहिए आप didEnterBackground में क्या करने की जरूरत। इसके बाद, आप गारंटी नहीं दे सकते कि आपके किसी भी कोड को फिर से बुलाया जाएगा।

2

आप सेट कर सकते हैं अपने Application does not run in background" = "YES" अपने Info.plist फ़ाइल में और आप देख सकते हैं applicationWillTerminate प्रतिनिधि NSUserDefaults में & भंडारण मान कहा हो रही।

enter image description here

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