अगर उपयोगकर्ता द्वारा बल-छोड़ दिया जाता है तो क्या iOS मेरे ऐप को पृष्ठभूमि में लॉन्च करेगा?


219

मैं content-availableएक पुश नोटिफिकेशन पर ध्वज का उपयोग करके एक पृष्ठभूमि प्राप्त कर रहा हूं । मेरे पास है fetchऔर remote-notification UIBackgroundModesसक्षम है।

यहाँ मैं अपने AppDelegate.m में उपयोग कर रहा हूं:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"Remote Notification Recieved");
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.alertBody =  @"Looks like i got a notification - fetch thingy";
    [application presentLocalNotificationNow:notification];
    completionHandler(UIBackgroundFetchResultNewData);

}

जब ऐप बैकग्राउंड में चल रहा होता है, तो यह ठीक काम करता है। (अधिसूचना प्राप्त हुई है और ऐप ने "जैसा दिखता है, मुझे एक अधिसूचना मिली" स्थानीय अधिसूचना को ट्रिगर किया, जैसा कि ऊपर दिए गए कोड को करना चाहिए)।

हालाँकि, जब ऐप नहीं चल रहा होता है और content-availableध्वज के साथ एक पुश सूचना प्राप्त होती है , तो ऐप लॉन्च नहीं किया जाता है और didRecieveRemoteNotificationप्रतिनिधि पद्धति को कभी नहीं बुलाया जाता है।

मल्टीटास्किंग के साथ WWDC वीडियो Whats New (WWDC 2013 से # 204) यह दिखाता है:यहां छवि विवरण दर्ज करें

यह कहता है कि आवेदन "पृष्ठभूमि में लॉन्च" किया जाता है जब content-availableध्वज के साथ एक धक्का अधिसूचना प्राप्त होती है ।

मेरा ऐप पृष्ठभूमि में लॉन्च क्यों नहीं हो रहा है?

तो असली सवाल यह है:

उपयोगकर्ता द्वारा ऐप छोड़ने के बाद क्या iOS पृष्ठभूमि कार्य करेगा?


आप कैसे देख रहे हैं कि ऐप बैकग्राउंड में लॉन्च हुआ है या नहीं?
भागदौड़

1
@runmad मैं बकवास का एक गुच्छा लॉग इन करता हूं- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
सांता क्लॉज

आप इसे कैसे लॉग कर रहे हैं, बस NSLog? आपको लॉन्च को अपनी ऐप स्कीम सेटिंग्स में मैनुअल सेट करना होगा (उत्तर देखें)
16:28 पर

@runmad जवाब पर टिप्पणी देखें
सांता क्लॉस

@HaimBenchimol Dj क्या आपको अपनी बग रिपोर्ट का जवाब मिलता है? मैं अपनी बग रिपोर्ट दाखिल करने के लिए आस-पास नहीं गया हूं।
सांता क्लॉस

जवाबों:


215

UPDATE2:

IOS 8 में पेश किए गए नए PushKit ढांचे का उपयोग करके आप इसे प्राप्त कर सकते हैं । हालांकि PushKit का उपयोग वीओआईपी के लिए किया जाता है। तो आपका उपयोग वीओआईपी से संबंधित होना चाहिए अन्यथा एप्लिकेशन अस्वीकृति का जोखिम है। ( यह उत्तर देखें )।


UDPDATE1:

IOS8 के लिए प्रलेखन स्पष्ट किया गया है । प्रलेखन यहाँ पढ़ा जा सकता है । यहाँ एक प्रासंगिक अंश दिया गया है:

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


यद्यपि यह WWDC वीडियो द्वारा स्पष्ट नहीं किया गया था, डेवलपर मंचों पर एक त्वरित खोज ने इसे बदल दिया:

https://devforums.apple.com/message/873265#873265 (लॉगिन आवश्यक)

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

यह पोस्ट एक Apple कर्मचारी द्वारा किया गया था, इसलिए मुझे लगता है कि मुझे विश्वास है कि यह जानकारी सही है।

तो ऐसा लगता है कि जब ऐप को ऐप स्विचर से मार दिया जाता है (ऊपर स्वाइप करके), ऐप को कभी भी लॉन्च नहीं किया जाएगा, यहां तक ​​कि अनुसूचित पृष्ठभूमि के लिए भी।


2
मेरे लिए "didFinishLaunchingWithOptions" में एक्शन जोड़ना जब लॉन्चिंग ऑप्शंस नहीं हैं तो काम नहीं किया। मेरे पास यहाँ एक ही तरीका है जैसे "didreceiveRemoteNotification"
harsh.prasad

@ कठोर.प्रसाद दिलचस्प है। समस्या यह थी कि जब ऐप को ऐप स्विचर से मार दिया गया हो तो ऐप लॉन्च नहीं किया गया हो।
सांता क्लॉज

3
यदि कोई मूक पुश प्राप्त होता है, तो ऐप को ऐप स्विचर में नहीं दिखाया जाना चाहिए। इसे ऐप स्विचर में जोड़े बिना बैकग्राउंड में लॉन्च किया जा सकता है और इसे चलाने और "अपनी बात करने" और फिर बाहर निकलने की अनुमति दी जा सकती है। ऐसे ऐप्स जो लंबे समय तक सक्रिय रहते हैं, वे उसी तरह मारे जाएंगे जैसे वे पहले से ही हैं।
माइंडजुइस

1
@chrizstone समाधान यह है कि यह इच्छित व्यवहार है, और आप इसके बारे में कुछ नहीं कर सकते।
सांता क्लॉज

1
@JPK उह, पुश सूचनाएँ स्वयं प्रभावित नहीं होती हैं। यह सिर्फ पृष्ठभूमि कार्य कर रहा है जो काम छोड़ने के बाद काम नहीं करेगा।
सांता क्लॉस

70

आप अपने लक्ष्य की लॉन्च सेटिंग "मैनेज स्कीम" में बदल सकते हैं Wait for <app>.app to be launched manually, जो आपको एक ब्रेकप्वाइंट सेट करके application: didReceiveRemoteNotification: fetchCompletionHandler:और बैकग्राउंड लॉन्च को ट्रिगर करने के लिए पुश नोटिफिकेशन भेजकर डीबग करने की अनुमति देता है ।

मुझे यकीन नहीं है कि यह समस्या को हल कर देगा, लेकिन यह अभी के लिए डिबगिंग में आपकी सहायता कर सकता है।

स्क्रीनशॉट


इसलिए इससे मदद मिली लेकिन यह मुद्दा अभी भी मौजूद है
सांता क्लॉज

अजीब। मुझे लगता है कि आप डबल से अधिक की जाँच कर चुके हैं, सभी फ़्लैश आपकी मुट्ठी में सेट हैं, आदि?
रनडम

इसके अलावा, मुझे पता है कि मेरे पास सब कुछ सही है क्योंकि जब ऐप पृष्ठभूमि में होता है, तो सब कुछ पूरी तरह से काम करता है। यह बस जब ऐप बिल्कुल भी नहीं चल रहा है।
सांता क्लॉज

मुझे आश्चर्य है कि अगर एक पुश नोटिफिकेशन लॉन्च-ट्रिगर सिस्टम-निर्धारित है। उदाहरण के लिए, यदि iOS यह निर्धारित करता है कि ऐप को लॉन्च करने के लिए यह एक बढ़िया समय नहीं है, तो हो सकता है कि इसे बाद में स्थगित कर दिया जाए। शायद सभी चल रहे / बैकग्राउंड ऐप्स को आज़माएँ और देखें कि क्या होता है? मैं सिर्फ इस बिंदु पर अनुमान लगा रहा हूं: - /
runmad

बस कोशिश की। कुछ भी नहीं हुआ, हमेशा की तरह। मैं देव मंचों पर पूछ सकता हूं।
सांता क्लॉज

37

इसका उत्तर हां है, लेकिन 'बैकग्राउंड फेट' या 'रिमोट नोटिफिकेशन' का उपयोग नहीं करना चाहिए। पुशकीट वह उत्तर है जो आप चाहते हैं।

सारांश में, ios 8 में नया ढांचा, PushKit, नया पुश नोटिफिकेशन मैकेनिज्म है जो बिना किसी विजुअल अलर्ट प्रॉम्प्ट के चुपचाप आपके ऐप को बैकग्राउंड में लॉन्च कर सकता है, यहां तक ​​कि आपके ऐप को ऐप स्विचर से स्वाइप करके मार दिया गया था, आश्चर्यजनक रूप से आप भी इसे नहीं कर सकते। ऐप स्विचर से।

Apple से PushKit संदर्भ:

PushKit फ्रेमवर्क आपके iOS ऐप्स के लिए दूरस्थ सर्वर से पुश प्राप्त करने के लिए कक्षाएं प्रदान करता है। पुश दो प्रकारों में से एक हो सकते हैं: मानक और वीओआईपी। मानक पुश आईओएस के पिछले संस्करणों की तरह ही सूचनाएं दे सकते हैं। वीओआईपी पुश उपयोगकर्ता के लिए एक अधिसूचना प्रदर्शित करने से पहले पुश के ऑन-डिमांड प्रसंस्करण को करने के लिए वीओआईपी ऐप्स के लिए आवश्यक मानक पुश के शीर्ष पर अतिरिक्त कार्यक्षमता प्रदान करता है।

इस नई सुविधा को लागू करने के लिए, कृपया इस ट्यूटोरियल देखें: https://zeropush.com/guide/guide-to-pushkit-and-voip - मैंने इसे अपने डिवाइस पर परीक्षण किया है और यह उम्मीद के मुताबिक काम करता है।


9
मुझे लगता है कि आपको वीओआईपी का उपयोग करके अपना ऐप सेट करना होगा। यदि आप ऐप वास्तव में एक वीओआईपी ऐप नहीं है, तो क्या यह सिर्फ समीक्षा के दौरान अस्वीकृत नहीं होगा?
duncanc4

6
दुर्भाग्य से, ऐप्पल द्वारा सत्यापन प्रक्रिया को जानना, यह तर्कसंगत होगा कि आवेदन खारिज कर दिया गया था।
केपा संतोस

3
वीओआईपी के लिए इस्तेमाल किया। यदि उपयोगकर्ता के लिए वीओआईपी का उपयोग नहीं किया जाता है, तो यह समीक्षा अस्वीकृति के जोखिम को बहुत बढ़ा देगा।
क्रिस

ऐसा लगता है कि बड़े प्रदाता पृष्ठभूमि में सामान चलाने के बहाने के रूप में इस सुविधा का उपयोग कर रहे हैं और ऐप्पल एक आँख बंद करके चल रहा है। उस समय Android एक फीचर बनना।
TCB13

PushKit वीओआईपी, फ़ाइल प्रदाता और वॉच जटिलताओं के लिए आरक्षित है। यह उन उपयोग मामलों के लिए उपलब्ध नहीं है जिनका उत्तर यह वर्णन करता है।
quellish

15

वास्तव में अगर आपको बैकग्राउंड टेस्ट करने की आवश्यकता है तो आपको स्कीम में एक विकल्प को सक्षम करना होगा:

bg लाने में सक्षम

एक और तरीका है कि आप इसे कैसे परख सकते हैं: अनुकरणीय बी.जी.

इस नई सुविधा के बारे में पूरी जानकारी यहाँ दी गई है: http://www.objc.io/issue-5/multitasking.html


4

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

यह दुर्भाग्यपूर्ण है कि व्यवहार पहले की तुलना में काफी अलग है। IOS 6 पर, अगर आपने ऐप को जिगलिंग आइकन्स से मार दिया, तो यह अभी भी SLC ट्रिगर पर फिर से जागृत हो जाएगा। अब, यदि आप स्वाइप करके मारते हैं, तो ऐसा नहीं होता है।

यह एक अलग व्यवहार है, और उपयोगकर्ता, जो हमारे ऐप से उपयोगी जानकारी प्राप्त करना जारी रखेंगे अगर उन्होंने इसे iOS 6 पर मार दिया था, तो अब नहीं करेंगे।

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


2
ठीक यही हमने किया था (ApplicationWillTerminate), लेकिन मुझे विश्वास नहीं है कि यह मेमोरी पर्ज के दौरान सूचना देता था, कम से कम iOS 7 पर नहीं। मैंने ध्यान दिया कि इसने OS अपग्रेड के लिए रिबूट से ठीक पहले सूचना दी थी, लेकिन ऐसा है यह बहुत बुरा नहीं लगता था।
स्नारशाद

"IOS 6 पर, यदि आपने जिग्लिंग आइकन से ऐप को मार दिया है, तो यह अभी भी CC ट्रिगर पर फिर से जागृत हो जाएगा। अब, यदि आप स्वाइप करके मारते हैं, तो ऐसा नहीं होता है।" अब ऐसा होता है, यह आईओएस 7. के प्रारंभिक संस्करण में एक अस्थायी प्रतिगमन था
फंकीबॉय

3

यह आपकी मदद कर सकता है

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

स्रोत: https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html


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