IPhone एप्लिकेशन से बाहर निकलने का उचित तरीका?


277

मैं एक iPhone ऐप प्रोग्रामिंग कर रहा हूं, और मुझे कुछ उपयोगकर्ता कार्यों के कारण इसे बाहर निकलने के लिए मजबूर करना होगा। ऐप को आवंटित किए गए मेमोरी को साफ करने के बाद, एप्लिकेशन को समाप्त करने के लिए कॉल करने का उपयुक्त तरीका क्या है?


34
केवल एक ही उचित तरीका है - होम बटन ..
बेरिलियम

5
एकमात्र ऐसी स्थिति जिसकी मैं कल्पना कर सकता हूं कि कोई भी व्यक्ति प्रोग्राम से बाहर निकलने पर विचार कर सकता है, वह निम्न परिदृश्य है: ऐप शुरू होता है, उपयोग की शर्तों को प्रदर्शित करता है, फिर स्वीकार करने से इंकार कर देता है। यह कुछ ऐसा ब्रांड है जो कभी-कभी डेवलपर पर दबाव डालता है। लेकिन यह गलत है।
डैनियल

6
@Daniel आम तौर पर आप अपने अस्वीकरण / उपयोग की शर्तें (EULA) itunes कनेक्ट पर डालते हैं जब आप एप्लिकेशन अपलोड करते हैं। यदि उपयोगकर्ता आपके ऐप को डाउनलोड करता है तो इसका मतलब है कि उन्होंने आपका EULA
पॉल डे लैंग

8
आईओएस ऐप को छोड़ने के लिए मजबूर करने के लिए पूरी तरह से वैध कारण हैं। मेरा मामला यह है कि मैं अपने ऐप के प्री-लॉन्च बीटा संस्करण वितरित कर रहा हूं। बीटा संस्करण सभी IAP मुक्त करने के लिए खोलते हैं। इनकी समय सीमा होती है और कुछ हफ्तों के बाद समाप्त होने की आवश्यकता होती है। इसलिए मैं बीटा अवधि समाप्त होने के बाद ऐप को मारने के लिए नीचे दिए गए उत्तर का उपयोग कर रहा हूं। मैं इसे LIVE संस्करण में निकालूंगा। लेकिन फिर भी जवाब ने मेरी मदद की और सही है!
बैडविसेल

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

जवाबों:


217

क्या आपने कोशिश की है exit(0)?

वैकल्पिक रूप से [[NSThread mainThread] exit], हालांकि मैंने कोशिश नहीं की है कि यह अधिक उपयुक्त समाधान की तरह लगता है।


85
चूंकि ऐसा करना एक Apple no-no (आपके ऐप को अमानक इंटरफ़ेस के लिए ऐप-स्टोर में अस्वीकार करने का कारण हो सकता है), अगस्त के उत्तर को "सही एक" मानें। FYI करें, यह उत्तर (ब्रेट का) सभी C कार्यक्रमों के लिए सही है, और सभी कोको कार्यक्रमों के लिए NSThread है।
ऑली

21
Tech Q & A QA1561 में, Apple दृढ़ता से निकास के उपयोग को हतोत्साहित करता है क्योंकि यह ऐप को क्रैश होने का आभास देता है। डेवलपर
.apple.com

8
[[NSThread mainThread] निकास] आपके एप्लिकेशन को क्रैश करने का कारण बनता है, क्योंकि बाहर निकलना एक उदाहरण विधि नहीं है। निकास (0) iOS 4 में पृष्ठभूमि के लिए एप्लिकेशन भेज देगा। निकास (0) को कॉल करना फिर से क्रैश हो जाएगा। कम से कम सिम्युलेटर में।
14:123 पर user123444555621

10
मैं समझता हूं कि इतने सारे लोग इसके खिलाफ क्यों सलाह दे रहे हैं, लेकिन हमें डेवलपर्स को कुछ क्रेडिट देने के बारे में कैसे? हम सभी वयस्क हैं और हम इस सुविधा के बारे में जानना चाहते हैं। मुझे यह आंतरिक क्यूए बिल्ड के लिए बहुत उपयोगी लगता है और, जब मैंने पहली बार इसके लिए खोज की थी, तो यह "गलत" उत्तर देखकर खुशी हुई।
इवानफ्लेश

7
@ केविन "ऐसा मत करो" कभी सही उत्तर नहीं है। यदि आपको पसंद है तो चेतावनी और अस्वीकरण दें, लेकिन "मैं यह कैसे करूँ" का एकमात्र सही उत्तर है "यहाँ कैसे करना है"। अगर मैं कुछ करने के तरीके की खोज कर रहा हूं (शायद मैं इसे डिबगिंग के दौरान बाहर निकलने के लिए मजबूर करना चाहता हूं), लोग सही तरीके से "नहीं!" की घोषणा कर रहे हैं। और मुझे जिस उत्तर की आवश्यकता है उसे दफनाने की कोशिश करना मेरे समय की बर्बादी है। हालांकि कई लोगों के पास कुछ करने के लिए बुरे कारण हो सकते हैं, सही स्टैकऑवरफ्लो उत्तर वह है जो प्रश्न का उत्तर देता है, क्योंकि अच्छे कारणों वाले लोग इसके साथ ही अपना रास्ता भी खोज लेंगे।
ग्लेन मेनार्ड

274

IPhone पर ऐप छोड़ने की कोई अवधारणा नहीं है। केवल एक एक्शन जिसके कारण किसी ऐप को छोड़ना चाहिए, फोन पर होम बटन को छू रहा है, और यह कुछ डेवलपर्स के लिए उपयोग नहीं है।

Apple के अनुसार, आपके ऐप को अपने आप समाप्त नहीं होना चाहिए। चूंकि उपयोगकर्ता ने होम बटन नहीं मारा था, इसलिए होम स्क्रीन पर कोई भी वापसी उपयोगकर्ता को यह आभास देती है कि आपका ऐप क्रैश हो गया है। यह भ्रामक है, गैर-मानक व्यवहार है और इससे बचना चाहिए।


13
जैसा कि मैंने कहा, यह गैर-मानक व्यवहार है और इसे टाला जाना चाहिए। iPhone ऐप डेस्कटॉप ऐप नहीं हैं। उन्हें इस तरह मत समझो।
अगस्त

8
मैं एपल्स की राय को समझ सकता हूं, लेकिन मेरे पास एक समान स्थिति है, मेरे आवेदन को इंटरनेट एक्सेस की आवश्यकता है, अगर यह उपलब्ध नहीं है तो उन्हें केवल त्रुटि संदेश होने के बजाय ऐप को छोड़ने में सक्षम होना चाहिए
एंथनी मेन

22
हमारे पास ऐसे ऐप्स हैं जो लोगों को सोने में मदद करते हैं। वे चाहते हैं कि बैटरी की निकासी कम करने के लिए ऐप एक निर्धारित अवधि के बाद समाप्त हो जाए। मुझे लगता है कि यह मामला स्वीकार्य है - क्योंकि उपयोगकर्ता उम्मीद से सो रहा है और मैन्युअल रूप से ऐप से बाहर नहीं निकल सकता है।
जेम्ससुगर

36
मैं अभी भी असहमत हूँ। जब वे जागते हैं, तो ऐप "चला गया" उपयोगकर्ता को आश्चर्यचकित करता है कि क्या हुआ। इसके बजाय, अपने ऐप में टाइमर सेट करें, फिर जब समय समाप्त हो जाए, तो ऐप को निष्क्रिय कर दें - कोई गतिविधि नहीं। पूरी तरह से कुछ भी नहीं करने वाला ऐप बैटरी खत्म नहीं करेगा। स्प्रिंगबोर्ड एक ऐप भी है - यह सिर्फ ऊर्जा बचाने के लिए बंद नहीं करता है। इसके बजाय, यह केवल उपयोगकर्ता इनपुट की प्रतीक्षा करता है।
अगस्त

8
यह वास्तव में इस सवाल का जवाब नहीं देता है। यह 100% सटीक है, लेकिन मुझे लगता है कि आदर्श रूप से ओपी के प्रश्न पर या स्वीकृत उत्तर पर टिप्पणी होगी।
बेन ज़ोट्टो

49

निकास (0) उपयोगकर्ता को क्रैश के रूप में प्रकट होता है, इसलिए उपयोगकर्ता को एक पुष्टिकरण संदेश दिखाते हैं। पुष्टिकरण के बाद सस्पेंड (होम बटन प्रोग्रामेटिक रूप से) और 2 सेकंड प्रतीक्षा करें, जबकि ऐप एनीमेशन के साथ बैकग्राउंड जा रहा है, तब उपयोगकर्ता के विचार से बाहर निकलें

-(IBAction)doExit
{
    //show confirmation message to user
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Confirmation"
                                                 message:@"Do you want to exit?"
                                                delegate:self
                                       cancelButtonTitle:@"Cancel"
                                       otherButtonTitles:@"OK", nil];
    [alert show];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex != 0)  // 0 == the cancel button
    {
        //home button press programmatically
        UIApplication *app = [UIApplication sharedApplication];
        [app performSelector:@selector(suspend)];

        //wait 2 seconds while app is going background
        [NSThread sleepForTimeInterval:2.0];

        //exit app when app is in background
        exit(0);
    }
}

1
क्या सेब इस "निकास (0)" को मंजूरी देगा? क्योंकि कुछ लोग कहते हैं कि ऐप्पल आपके ऐप को अस्वीकार कर देगा जब आप बाहर निकलें 0. का उपयोग करेंगे
गजेंद्र के चौहान

2
@GajendraKChauhan exit(0)कोई मायने नहीं रखता। प्वाइंट आपके ऐप में "छोड़ने का व्यवहार" है। कुछ ही ऐप को छोड़कर AppStore में व्यवहार को प्रतिबंधित करना बहुत महत्वपूर्ण है जो कि बहुत ही महत्वपूर्ण 3rd-पार्टियों द्वारा बनाए गए हैं। इसके अलावा, होम बटन व्यवहार की नकल भी अस्वीकार किए जाने के अधीन है।
Eonil

41

प्रश्नोत्तर देखें :

प्रश्न: मैं अपने iOS एप्लिकेशन को प्रोग्रामेटिक रूप से कैसे छोड़ सकता हूं?

IOS एप्लिकेशन को शालीनतापूर्वक समाप्त करने के लिए कोई API प्रदान नहीं किया गया है।

IOS में, उपयोगकर्ता होम बटन को एप्लिकेशन को बंद करने के लिए दबाता है। क्या आपके आवेदन में ऐसी स्थितियां हैं, जिसमें वह अपना इच्छित कार्य नहीं दे सकता है, अनुशंसित दृष्टिकोण उपयोगकर्ता के लिए एक चेतावनी प्रदर्शित करने के लिए है जो समस्या की प्रकृति और संभावित क्रियाओं को इंगित करता है जो उपयोगकर्ता ले सकता है - वाईफाई चालू करना, स्थान सेवाएँ सक्षम करना, आदि। उपयोगकर्ता को अपने स्वयं के विवेक पर आवेदन को समाप्त करने की अनुमति दें।

चेतावनी:exit फ़ंक्शन को कॉल न करें । exitउपयोगकर्ता को दिखाई देने वाली एप्लिकेशन को एक शानदार समाप्ति प्रदर्शन करने और होम स्क्रीन पर वापस एनिमेट करने के बजाय क्रैश हो गया है।

इसके अतिरिक्त, डेटा को सहेजा नहीं जा सकता है, क्योंकि यदि आप बाहर निकलें तो -applicationWillTerminate:इसी तरह के UIApplicationDelegateतरीके लागू नहीं होंगे।

यदि विकास या परीक्षण के दौरान आपके आवेदन को समाप्त करना आवश्यक है, तो abortफ़ंक्शन, या assertमैक्रो की सिफारिश की जाती है


2
इसका पालन करने के लिए बस बिना बटन के एक AlertView जोड़ा। आसान।
Schultz9999

महान जवाब, बस बाहर निकलने के साथ काम किया (0) और पता नहीं था कि यह निजी एपीआई के अंतर्गत आता है
एलेक्स Cio

39

यह वास्तव में कार्यक्रम छोड़ने का एक तरीका नहीं है, बल्कि लोगों को छोड़ने के लिए मजबूर करने का एक तरीका है।

UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Hit Home Button to Exit" message:@"Tell em why they're quiting" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
[anAlert show];

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

कल्याण के उत्तर का उपयोग करें ताकि होम बटन दबाने पर ऐप क्विट हो जाए।
तैमूर कुचक्रोव

इसके साथ समस्या यह है कि यह वास्तव में ऐप से बाहर नहीं निकलता है, इसलिए डेवलपर द्वारा बाहर निकलने (अवैध / पुराने यूआई को फेंकने, स्थिरांक आदि को बाहर फेंकने) द्वारा कुछ भी करना चाह सकते हैं, जब तक कि उपयोगकर्ता आवेदन को स्वाइप नहीं करता। बन्द है।
बेन लेगिएरो

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

38

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


1
लेकिन पृष्ठभूमि की प्रक्रिया भी खारिज हो जाती है।
गजेंद्र के चौहान

17

जोड़ें UIApplicationExitsOnSuspendपर संपत्ति application-info.plistके लिए true


क्या इस सेटिंग को रन-टाइम में बदला जा सकता है? मेरा मतलब है, मैं पृष्ठभूमि में रहना चाहता हूं, सिवाय इसके कि जब मेरा ऐप अगले सस्पेंड पर छोड़ने के लिए चुनता है - जिस समय में मैं UIApplicationExitsOnSuspend को पेश करना चाहता हूं। क्या यह संभव है?
मत्ती श्योनर

13

कुछ परीक्षणों के बाद, मैं निम्नलिखित कह सकता हूं:

  • निजी इंटरफ़ेस का उपयोग करना: [UIApplication sharedApplication]यह दुर्घटनाग्रस्त होने की तरह दिखने वाले ऐप का कारण होगा, लेकिन ऐसा करने से - (void)applicationWillTerminate:(UIApplication *)applicationपहले यह कॉल करेगा ;
  • उपयोग exit(0);करने से एप्लिकेशन भी समाप्त हो जाएगा, लेकिन यह "सामान्य" दिखेगा (स्प्रिंगबोर्ड के आइकन उम्मीद की तरह दिखाई देते हैं, ज़ूम आउट प्रभाव के साथ), लेकिन यह - (void)applicationWillTerminate:(UIApplication *)applicationप्रतिनिधि पद्धति को कॉल नहीं करेगा ।

मेरी सलाह:

  1. - (void)applicationWillTerminate:(UIApplication *)applicationप्रतिनिधि को मैन्युअल रूप से बुलाओ ।
  2. पुकारते हैं exit(0);

Apple का कहना है कि "एप्लीकेशन कॉलिंग एग्जिट के कारण उपयोगकर्ता को दिखाई देने वाली एग्जॉस्ट समाप्त हो जाएगी, बल्कि एक शानदार टर्मिनेशन करने और होम स्क्रीन पर वापस एनिमेट करने के लिए" डेवलपर.
मिकाडी

8

आपके ApplicationDelegate को उपयोगकर्ता द्वारा जानबूझकर छोड़ने की सूचना मिलती है:

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

जब मुझे यह सूचना मिलती है तो मैं फोन करता हूं

        exit(0);

जो सभी काम करता है। और सबसे अच्छी बात यह है कि यह उपयोगकर्ता को छोड़ने का इरादा है, यही कारण है कि इसे वहां कॉल करने में कोई समस्या नहीं होनी चाहिए।

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

इसलिए इसके बजाय मैंने एक झंडे को सेट किया, ताकि अगले बैकग्राउंडिंग एक्शन पर ऐप छोड़ दिया जाए। जो सिंक के बाद ऐप को रिफ्रेश करने के लिए ठीक है।


1
यह एक अच्छा समाधान नहीं है क्योंकि एप्लिकेशन अन्य कारणों से सक्रिय इस्तीफा दे देगा, जैसे कि इनकमिंग फोन कॉल।
फ्रैंककोडियर

समाधान यह है कि ऐसा करने के लिए उपयोगी होने पर ही एक चेक को जोड़ा जाए। उदाहरण के लिए यदि उपयोगकर्ता स्टार्ट स्क्रीन पर है। फिर अगर फोनकॉल आ रहा है तो भी यह ठीक है। मेरे ऐप में iOS 2 के बाद से Apple ने इसे खारिज नहीं किया है। stackoverflow.com/a/43906936/712124
बिल्ली

6

मेरा ऐप अस्वीकृत कर दिया गया है हाल ही में bc मैंने एक अनिर्दिष्ट विधि का उपयोग किया है। वस्तुतः:

"दुर्भाग्य से इसे ऐप स्टोर में नहीं जोड़ा जा सकता है क्योंकि यह एक निजी एपीआई का उपयोग कर रहा है। गैर-सार्वजनिक एपीआई का उपयोग, जिसे iPhone डेवलपर प्रोग्राम लाइसेंस अनुबंध अनुभाग 3.3.1 में उल्लिखित किया गया है:

"3.3.1 अनुप्रयोग केवल Apple द्वारा निर्धारित तरीके से प्रलेखित API का उपयोग कर सकते हैं और किसी भी निजी API का उपयोग या कॉल नहीं करना चाहिए।"

आपके आवेदन में शामिल किया गया गैर-सार्वजनिक एपीआई समाप्त हो गया है "असफल"


6

Apple का कहना है:

"चेतावनी: एग्जिट फंक्शन को कॉल न करें। एग्जिट कॉलिंग वाले एप्स यूजर को एक शानदार टर्मिनेशन को पूरा करने और होम स्क्रीन पर वापस एनिमेट करने के बजाय क्रैश होते दिखाई देंगे।"

मुझे लगता है कि यह एक बुरी धारणा है। यदि उपयोगकर्ता एक त्यागें बटन पर टैप करता है और एक संदेश प्रकट होता है, जो कुछ कहता है: "एप्लिकेशन अब छोड़ दिया जाएगा।", यह दुर्घटनाग्रस्त नहीं होता है। Apple को एप्लिकेशन छोड़ने का एक वैध तरीका प्रदान करना चाहिए (बाहर नहीं निकलना) (0)।


3
वे कहते हैं कि यह होम बटन है जिसे यह किसी भी iDevice के नीचे स्थित किया जा सकता है। तो इस वजह से कभी भी अपने खुद के छोड़े गए बटन को बनाने की आवश्यकता नहीं होती है।
पोपी

4

यह एक अच्छा जवाब मिल गया है लेकिन थोड़ा विस्तार करने का फैसला किया है:

आप Apple के iOS मानव इंटरफ़ेस दिशानिर्देशों को अच्छी तरह से पढ़े बिना अपने आवेदन को AppStore में स्वीकार नहीं कर सकते। (वे आपके खिलाफ कुछ भी करने के लिए आपको अस्वीकार करने का अधिकार बरकरार रखते हैं) खंड "डोंट क्विट प्रोग्रामेटिकली" http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices। html एक सटीक दिशानिर्देश है कि आपको इस मामले में कैसे व्यवहार करना चाहिए।

यदि आपको कभी भी Apple प्लेटफ़ॉर्म के साथ कोई समस्या है, तो आप आसानी से HIG से परामर्श नहीं कर सकते। यह संभव है कि Apple बस आपको ऐसा नहीं करना चाहता है और वे आमतौर पर (मैं Apple नहीं हूं इसलिए मैं हमेशा गारंटी नहीं दे सकता) उनके प्रलेखन में ऐसा कहते हैं।


3

हम्म, आपको आवेदन छोड़ना पड़ सकता है यदि, कहते हैं, आपके आवेदन को इंटरनेट कनेक्शन की आवश्यकता है। आप एक अलर्ट प्रदर्शित कर सकते हैं और फिर कुछ इस तरह से कर सकते हैं:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}

9
नहीं, आपको इसे समाप्त करने की आवश्यकता नहीं है। उदाहरण के लिए, आईट्यून्स ऐप, जब यह एक उचित कनेक्शन का पता नहीं लगा सकता है तो बस एक स्क्रीन डालता है जो कहता है कि वे कनेक्ट नहीं हैं। यह नहीं छोड़ता है, यह बस क्या हो रहा है के उपयोगकर्ता को सूचित करता है। यूजर इसके बाद होम बटन पर टैप करके क्विट करता है।
अगस्त

1
यदि यह कार्य करने में असमर्थ है, तो कम्पास ऐप क्विट करता है।
जोश ली

3

हम का उपयोग कर एप्लिकेशन से बाहर निकलने नहीं कर सकते हैं exit(0), abort()काम करता है, एप्पल दृढ़ता से इन कार्यों के उपयोग को हतोत्साहित के रूप में। यद्यपि आप इस कार्य को विकास या परीक्षण के उद्देश्य के लिए उपयोग कर सकते हैं।

यदि विकास या परीक्षण के दौरान यह आपके आवेदन को समाप्त करने के लिए आवश्यक है, तो गर्भपात समारोह या मुखर मैक्रो की सिफारिश की जाती है

अधिक जानकारी प्राप्त करने के लिए कृपया इस Apple Q & A थ्रेड को खोजें।

इस फंक्शन के उपयोग से इम्प्रेशन बनता है जैसे एप्लिकेशन क्रैश हो रहा है। इसलिए मुझे कुछ सुझाव मिले जैसे कि हम कुछ कार्यक्षमता की अनुपलब्धता के कारण ऐप को बंद करने के बारे में जागरूक उपयोगकर्ता को समाप्ति संदेश के साथ अलर्ट प्रदर्शित कर सकते हैं।

लेकिन ऐप और स्टार्टिंग को रोकने के लिए iOS मानव इंटरफ़ेस दिशानिर्देश , यह सुझाव देता है कि एप्लिकेशन को समाप्त करने के लिए कभी भी क्विट या क्लोज बटन का उपयोग न करें । बल्कि तब कि वे स्थिति को समझाने के लिए उचित संदेश प्रदर्शित करने का सुझाव दे रहे हैं।

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

प्रोग्राम से iOS ऐप कभी न छोड़ें। लोग इसे एक दुर्घटना के रूप में व्याख्या करते हैं। यदि कुछ आपके ऐप को उद्देश्य से कार्य करने से रोकता है, तो आपको उपयोगकर्ताओं को स्थिति के बारे में बताने और यह समझाने की आवश्यकता है कि वे इसके बारे में क्या कर सकते हैं।


2

उपरोक्त के अलावा, अच्छा, उत्तर मैं सिर्फ जोड़ना चाहता था, अपनी स्मृति को साफ करने के बारे में सोचें।

आपके आवेदन से बाहर निकलने के बाद, iPhone OS स्वचालित रूप से आपके द्वारा छोड़ी गई किसी भी चीज़ को साफ कर देगा, इसलिए सभी मेमोरी को मैन्युअल रूप से खाली करने से आपके एप्लिकेशन को बाहर निकलने में लगने वाले समय में वृद्धि हो सकती है।


कृपया IOS4.0 और उत्तर प्रदेश के वर्तमान परिदृश्य में अपने उत्तर को संशोधित करें ..: P
rptwsthi

2
- (IBAction)logOutButton:(id)sender
{
   //show confirmation message to user
   CustomAlert* alert = [[CustomAlert alloc] initWithTitle:@"Confirmation" message:@"Do you want  to exit?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
   alert.style = AlertStyleWhite;
   [alert setFontName:@"Helvetica" fontColor:[UIColor blackColor] fontShadowColor:[UIColor clearColor]];
   [alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

   if (buttonIndex != 0)  // 0 == the cancel button
   {
      //home button press programmatically
      UIApplication *app = [UIApplication sharedApplication];
      [app performSelector:@selector(suspend)];
      //wait 2 seconds while app is going background
      [NSThread sleepForTimeInterval:2.0];
      //exit app when app is in background
      NSLog(@"exit(0)");
      exit(0);
  }
}

1

मैंने टेल-एग्जिट (0) फ़ंक्शन कॉल किए बिना एप्लिकेशन को बल-छोड़ (क्रैश) करने के लिए ऊपर उल्लिखित [[NSMutableArray new] addObject: nil] दृष्टिकोण का उपयोग किया।

क्यों? क्योंकि मेरा ऐप मैन-इन-द-बीच हमलों को रोकने के लिए सभी नेटवर्क एपीआई कॉल पर सर्टिफिकेट पिनिंग का उपयोग करता है। इनमें स्टार्टअप पर मेरा वित्तीय ऐप कॉल के इनिशियलाइज़ेशन कॉल शामिल हैं।

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

इसलिए, इस एक मामले में, हमने उपयोगकर्ता को यह सूचित करने के लिए एक चेतावनी देना सबसे अच्छा समझा कि ऐप असुरक्षित माहौल में चल रहा है और फिर, जब वे "क्लोज़" मारते हैं, तो उपरोक्त विधि का उपयोग करके ऐप को छोड़ दें।


मैं यह नहीं देख सकता कि आपको एक पूर्ण-स्क्रीन सांसारिक चेतावनी प्रदर्शित करने से क्या पता चलता है, उपयोगकर्ता को बता रहा है कि ऐप उन "प्रमाणपत्र पिनिंग" कारणों के लिए उपयोग करने योग्य नहीं है, और यही है। उपयोगकर्ता अंततः एप्लिकेशन को बंद कर देगा। आप नहीं जानते होंगे, लेकिन iOS आपकी प्रक्रिया को मारने (अपनी स्थिति बनाए रखने) और बाद में इसे बहाल करने का अधिकार सुरक्षित रखता है, और iOS एप्लिकेशन का "जीवन-चक्र" वास्तव में आपके हाथों में नहीं है। आपका क्रैश - बस एक दुर्घटना है, और ओएस वैसे भी ऐप को पुनर्जीवित करने का विकल्प चुन सकता है।
मत्ती श्नोर

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

पुरानी ऐप संरचना ने स्टार्टअप एपीआई कॉल को फिर से प्राप्त करने का कोई अच्छा तरीका नहीं दिया और ऐप उनके बिना असंगत स्थिति में था। हम एक स्थायी ब्लॉक स्क्रीन का उपयोग कर सकते थे, लेकिन इसके लिए उपयोगकर्ता को एप्लिकेशन को स्वयं छोड़ने के लिए बाध्य करना आवश्यक था और यह निर्णय लिया गया था कि प्रत्येक उपयोगकर्ता HOW को डबल-क्लिक और बल छोड़ चुके ऐप्स को नहीं जानता था। आज आसान, लेकिन तीन साल पहले काफी छिपा हुआ।
माइकल लॉन्ग

1
[[UIApplication sharedApplication] terminateWithSuccess];

यह ठीक काम किया और स्वचालित रूप से कॉल करता है

- (void)applicationWillTerminateUIApplication *)application delegate.

संकलन समय चेतावनी निकालने के लिए इस कोड को जोड़ें

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 

5
यह एक निजी तरीका है, डिएगो मर्कैडो ने ऊपर बताया है कि उसका ऐप खारिज हो गया, फिर ऐसा जोखिम क्यों लिया जाए।
आरवीएन

निजी एपीआई का उपयोग ऐप को ऐप द्वारा खारिज कर दिया जाएगा।
ZYiOS

2
एंटरप्राइज़ ऐप के लिए - यह एक समाधान हो सकता है।
user1140780

- (IBAction) exitApp: (आईडी) प्रेषक {SEL चयनकर्ता = NSSelectorFromString (@ "terminateWithSuccess"); [आत्म प्रदर्शनकर्ता: चयनकर्ता withObject: [UIApplication sharedApplication]]; }
unom

@unmircea ने किया था पास रिव्यू?
विस्मय-ओ

1

आपको फ़ंक्शन exit(0)को सीधे कॉल नहीं करना चाहिए क्योंकि यह तुरंत आवेदन छोड़ देगा और ऐसा लगेगा कि आपका ऐप क्रैश हो गया है। यूजर्स को कंफर्म अलर्ट दिखाने के लिए बेहतर है और उन्हें खुद ऐसा करने दें।

स्विफ्ट 4.2

func askForQuit(_ completion:@escaping (_ canQuit: Bool) -> Void) {
    let alert = UIAlertController(title: "Confirmation!", message: "Do you want to quit the application", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(true)
    }))
    alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.cancel, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(false)
    }))
    self.present(alert, animated: true, completion: nil)
}

/// Will quit the application with animation
func quit() {
    UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
    /// Sleep for a while to let the app goes in background
    sleep(2)
    exit(0)
}

उपयोग:

self.askForQuit { (canQuit) in
     if canQuit {
         self.quit()
     }
}

0

ऐप से बाहर निकलने पर उपयोगकर्ता को यह तय करना चाहिए। मुझे नहीं लगता कि ऐप के क्विट होने पर यह एक अच्छा उपयोगकर्ता इंटरैक्शन है। इसलिए इसके लिए कोई अच्छा एपीआई नहीं है, केवल होम बटन में एक है।

यदि कोई त्रुटि है: इसे बेहतर तरीके से लागू करें या उपयोगकर्ता को सूचित करें। यदि कोई पुनरारंभ करना है: तो इसे उपयोगकर्ता को सूचित करना बेहतर तरीके से लागू करें।

यह गूंगा लगता है, लेकिन उपयोगकर्ता को निर्णय लेने और उसे सूचित किए बिना ऐप से बाहर निकलना बुरा है। और चूंकि उपयोगकर्ता इंटरैक्शन के लिए एक होम बटन है, Apple बताता है, एक ही फ़ंक्शन (किसी ऐप से बाहर निकलने) के लिए 2 चीजें नहीं होनी चाहिए।


0

होम बटन के अलावा किसी अन्य ऐप से बाहर निकलें वास्तव में गैर-आईओएस-एस्क दृष्टिकोण है।

मैंने यह सहायक किया, हालांकि, कोई निजी सामान का उपयोग नहीं किया:

void crash()
{ [[NSMutableArray new] addObject:NSStringFromClass(nil)]; }

लेकिन अभी भी मेरे मामले में उत्पादन के लिए नहीं है। यह क्रैश रिपोर्टिंग का परीक्षण करने या कोर डेटा रीसेट के बाद तेजी से पुनः आरंभ करने के लिए है। यदि फ़ंक्शन को उत्पादन कोड में छोड़ दिया जाता है तो बस इसे अस्वीकार नहीं किया जाना सुरक्षित है।


0

स्विफ्ट 4.2 (या पुराने)

लाइब्रेरी का Darvinउपयोग किया जा सकता है।

import Darwin

exit(0) // Here you go

एनबी: यह आईओएस अनुप्रयोगों में पुनः शामिल नहीं है।

ऐसा करने से आपको क्रैश लॉग मिल जाएगा।


0

IPadOS 13 में अब आप इस तरह से सभी दृश्य सत्र बंद कर सकते हैं:

for session in UIApplication.shared.openSessions {
    UIApplication.shared.requestSceneSessionDestruction(session, options: nil, errorHandler: nil)
}

यह applicationWillTerminate(_ application: UIApplication)आपके ऐप के प्रतिनिधि को कॉल करेगा और अंत में ऐप को समाप्त कर देगा।

लेकिन दो बातों से सावधान रहें:

IOS / iPadOS 13 के दृश्यों के बारे में अधिक जानकारी: https://developer.apple.com/documentation/uikit/app_and_environment/scenes


-1

किसी अन्य तरीके से ऐप से बाहर निकलें

मैंने यह सहायक किया, हालांकि, कोई निजी सामान का उपयोग नहीं किया:

बाहर निकलें (0);


-1

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

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

यह (हालांकि शायद, नीचे नहीं देखना चाहिए :-) कुछ इस तरह से हासिल किया जा सकता है:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
        exit(0);
    } else {
       // normal handling.
    }
}

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

फिर भी, सिस्टम को यह बताने के लिए अधिक मानक दृष्टिकोण का उपयोग करना बेहतर होगा कि ऐप को समाप्त किया जा सकता है। इस मामले में उदाहरण के लिए, यह सुनिश्चित करके कि जीपीएस वर्तमान स्थान को अपडेट करने से रोककर उपयोग में नहीं है, यदि वर्तमान दृश्य पर वर्तमान दृश्य को दिखाने के स्थान को बंद करने सहित। इस तरह से सिस्टम [[UIApplication sharedApplication] backgroundTimeRemaining]ऐप को बैकग्राउंड में प्रवेश करने के कुछ मिनट बाद (यानी ) समाप्त करने का ध्यान रखेगा । यह एप्लिकेशन को समाप्त करने के लिए कोड का उपयोग किए बिना सभी समान लाभ प्राप्त करेगा।

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
       // stop requesting location updates if not already done so
       // tidy up as app will soon be terminated (run a background task using beginBackgroundTaskWithExpirationHandler if needed).
    } else {
       // normal handling.
    }
}

और बेशक, exit(0)अग्रभूमि में चलने वाले औसत उत्पादन ऐप के लिए उपयुक्त कभी नहीं होगा, जो अन्य उत्तरों के अनुसार है कि संदर्भ http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html

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