महत्वपूर्ण परिवर्तन स्थान API के लिए व्यवहार समाप्त / निलंबित होने पर?


108

यह यहां से अनुभाग है CLLocationManager प्रलेखन के साथ एप्लिकेशन व्यवहार का वर्णन startMonitoringSignificantLocationChanges :

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

तो मैं समझता हूँ कि यदि आपका ऐप्स समाप्त (और मुझे लगता है अगर तुम फोन नहीं है stopMonitoringSignificantLocationChanges से applicationWillTerminate ) यदि आप एक साथ उठ जाएगा UIApplicationLaunchOptionsLocationKey पैरामीटर didFinishLaunchingWithOptions: आवेदन । उस बिंदु पर आप अपना CLLocationManager बनाते हैं , startMonitoringSignificantLocationChanges को कॉल करते हैं और सीमित समय के लिए अपना बैकग्राउंड लोकेशन प्रोसेसिंग करते हैं । इसलिए मैं इस बिट के साथ ठीक हूं।

पिछला पैराग्राफ केवल इस बारे में बात करता है कि ऐप के समाप्त होने पर क्या होता है, यह सुझाव नहीं देता कि आप क्या करते हैं जब एप्लिकेशन निलंबित हो। दस्तावेज़ के लिए फ़ाइनशिशलॉन्चिंगथाइथॉसेस कहते हैं:

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

यह सुझाव देते हुए कि जब आपका एप्लिकेशन समाप्त हो जाएगा (केवल स्थान परिवर्तन के कारण) आपके समाप्त होने के बाद आपको यह कॉल प्राप्त होगी।

हालाँकि अवेयरनेस प्रोग्रामिंग गाइड में महत्वपूर्ण बदलाव सेवा पर दिए गए पैराग्राफ में निम्नलिखित बातें हैं:

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

यह बताता है कि यदि आपका ऐप निलंबित कर दिया गया है, तो आप स्थान डेटा के साथ जाग गए हैं, लेकिन यह उल्लेख करने में विफल हैं कि आप कैसे जाग गए हैं:

  • क्या UIApplicationDelegate को कॉलबैक मिलता है जो मुझे बताता है कि मैं एक निलंबित स्थिति से एक पृष्ठभूमि राज्य में फिर से शुरू कर रहा हूं?
  • क्या स्थान प्रबंधक (जो एप्लिकेशन को निलंबित कर दिया गया था जब फ्रीज सूख गया था) स्थान प्राप्त करना शुरू कर रहा है प्रबंधक: didUpdateToLocation: fromLocation कॉलबैक?
  • क्या मुझे अपने didUpdateToLocation संदेश में कोड लागू करने की आवश्यकता है जो एप्लिकेशन स्थिति की जांच करता है और यदि पृष्ठभूमि मोड में न्यूनतम प्रसंस्करण होता है?

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

जवाबों:


80

चूँकि मैंने यह प्रश्न पूछा था, इसलिए मैंने बहुत परीक्षण किया है (ज्यादातर घर और काम के बीच ट्रेन पर) और इस बात की पुष्टि की है कि निलंबित किए गए ऐप्स का व्यवहार वैसा ही है जैसा कि मुझे सवाल के अंत में संदेह है।

यही है, आपका निलंबित एप्लिकेशन जाग गया है, आपको अपने ऐप प्रतिनिधि पर कोई कॉलबैक प्राप्त नहीं होता है, इसके बजाय आप अपने मौजूदा CLLocationManagerDelegate के माध्यम से अपना स्थान अपडेट प्राप्त करते हैं । आप पता लगा सकते हैं कि आप एप्लिकेशनस्टैट की जाँच करके बैकग्राउंड में चल रहे हैं , और उस स्थान के लिए सीमित काम करें जहाँ आपको लोकेशन प्रोसेसिंग करने के लिए निलंबित अवस्था से जगाया गया है।

[UIApplication sharedApplication].applicationState == UIApplicationStateBackground

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

पिछले उत्तर में एनबी प्वाइंट छह सही नहीं है। जब वे एक निलंबित स्थिति से उठते हैं तो फ्रीज़ किए गए निलंबित ऐप को CLLocationManagerDelegate कॉलबैक प्राप्त करते हैं।


1
मेरे जवाब में # 6 बाहर करो ताकि लोगों को भ्रमित न करें।
एरॉन

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

नमूना ऐप के लिए बहुत बहुत धन्यवाद, यह मेरे लिए बहुत उपयोगी था। मेरे पास एक प्रश्न है: क्या होगा अगर मैं पृष्ठभूमि में मानक स्थान सेवा का उपयोग कर रहा था, महत्वपूर्ण नहीं, क्या उस मामले में समाप्ति के बाद भी ऐप को फिर से लॉन्च किया जाएगा? मैंने इस सवाल को यहां विस्तार से पूछा, मुझे खुशी होगी अगर आप मुझे हल्का कर सकते हैं:] stackoverflow.com/questions/12239967/…
aslisabanci


क्या आप जानते हैं कि आपके ऐप को समाप्त होने में कितना समय लगा? और फिर इसके बजाय एक ऐपडेलगेट कॉलबैक प्राप्त करें? (क्या यह 30 मिनट की तरह है? 2 घंटे? 5 घंटे?) इसका कारण मैं यह पूछ रहा हूं क्योंकि मैंने निगरानी के लिए एक क्षेत्र स्थापित किया है। मेरे ऐप को लॉन्च होते देखने के लिए कई बार कोशिश की, लेकिन केवल एक बार मैं ऐप को पुनः लॉन्च कर पाया। दूसरी बार didExitRegionकॉलबैक लेकिन मैं startLocationUpdatesवहाँ से नहीं जा सका क्योंकि यह ऐप लॉन्च के माध्यम से नहीं था ...
Honey

25

मेरी समझ इस प्रकार है (मैं एक एप्लिकेशन लिखने की प्रक्रिया में हूं जो इस एपीआई पर निर्भर है, लेकिन परीक्षण शुरू करने के लिए इस घटक को पूरा नहीं किया है:)

  1. आपका एप्लिकेशन पहली बार चलाया गया है, आप शुरू करने के लिए पंजीकरण करें ।SignificantLocationChanges , और कॉलबैक फ़ंक्शन प्रदान करें। जब आपका एप्लिकेशन चल रहा होता है, तो जब भी यह एक महत्वपूर्ण परिवर्तन प्राप्त करता है, तो यह उस कॉलबैक को कॉल करेगा।
  2. आपके आवेदन पृष्ठभूमि करने के लिए रखा जाता है, तो UIApplication प्राप्त होगा applicationWillResignActive , जिसके बाद applicationDidEnterBackground
  3. यदि आपका आवेदन पृष्ठभूमि में निलंबित होने पर मारा जाता है, तो आपको सूचित नहीं किया जाएगा; हालाँकि, यदि आपके एप्लिकेशन को चलाते समय मारा जाता है (मेरी जानकारी के लिए अग्रभूमि या पृष्ठभूमि), तो आपको applicationWillerminate के साथ एक पल मिलेगा । आप इस फ़ंक्शन से अतिरिक्त पृष्ठभूमि समय का अनुरोध नहीं कर सकते।
  4. पृष्ठभूमि में मारे जाने के बावजूद, ओएस आपके एप्लिकेशन को फिर से लॉन्च करेगा। आपके आवेदन बस एक बदलाव के लिए ओएस द्वारा शुरू की है, तो आप के लिए एक कॉल मिल जाएगा आवेदन didFinishLaunchingWithOptions :

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])

    यदि आप पृष्ठभूमि स्थान परिवर्तन से वापस आ गए हैं, तो यह निर्धारित करने में आपकी सहायता करेगा।

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

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

ओह, और अगर बुरी किस्मत के कुछ झटके से, आप एक ऐप जारी करते हैं, जो मुझे मेरा काम करना है, तो मैं रो सकता हूं :)

सौभाग्य!


1
@Tegeril +1 उत्तर के लिए धन्यवाद। मैं इस पर विकेट सुनना शुरू कर रहा था। :) मुझे आश्चर्य है कि जिन ऐप्स को निलंबित किया जाना शुरू किया गया था, उन्हें फिर से शुरू करने की आवश्यकता है ।MitoritoringSignificantLocationChanges क्या आपके पास डोको का लिंक है जहां यह वर्णित है? मेरी समझ यह थी कि एक निलंबित स्थिति से लोड होने के नाते आपके सभी ऑब्जेक्ट्स को तुरंत हटा दिया जाएगा क्योंकि वे ऐप के निलंबित होने पर थे। इसलिए मैं महत्वपूर्ण परिवर्तन अनुरोध को प्रभावी होने की उम्मीद करूंगा।
RedBlueThing

आप इस बारे में बात कर रहे होंगे? "पुन: लॉन्च होने पर, आपको अभी भी एक स्थान प्रबंधक ऑब्जेक्ट को कॉन्फ़िगर करना होगा और स्थान घटनाओं को जारी रखने के लिए इस विधि को कॉल करना होगा" लेकिन मुझे लगता है कि यह उस मामले का जिक्र है जहां आप एक समाप्त राज्य (एक स्थान घटना द्वारा) से लॉन्च किए गए ऐप को लॉन्च करते हैं। यह मूल रूप से मेरे प्रश्न का मूल है, 'निलंबित मामले के लिए क्या होता है?'।
RedBlueThing

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

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

1
मुझे खुशी है कि इससे कुछ निश्चित हुआ, मुझे भविष्य में मदद करनी चाहिए :)
हारून

1

यदि स्थान परिवर्तन के परिणामस्वरूप आवेदन को निलंबित स्थिति से हटा दिया जाता है, तो पृष्ठभूमि राज्य में एप्लिकेशन लॉन्च हो जाएगा।

सभी ऑब्जेक्ट लाइव होंगे और आप मौजूदा प्रतिनिधि में स्थान अपडेट प्राप्त करेंगे।

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