दिलचस्प पोस्ट
लिनक्स या विंडोज में ओएस एक्स के लिए संकलन कैसे करें? ListView और ListView के अंदर बटन यह SQL कोड त्रुटि 1066 क्यों देता है (अनन्य तालिका / उपनाम: 'उपयोगकर्ता')? कैसे iPhone एसडीके का उपयोग कर एक GUID / यूआईआईडी बनाने के लिए 'पूंछ' कमांड के बराबर विंडोज आईएसओ प्रोलॉग की जटिलता का अनुमान है सी ++ में बूस्ट का उपयोग कर एक धागा पूल कैसे बना सकता है? जावा में एक सादा पाठ फ़ाइल पढ़ना जावास्क्रिप्ट के माध्यम से छवि फ़ाइल आकार + आयाम निर्धारित करना? मैं बच्चे वर्ग के नाम को जानने के बिना किसी वस्तु के बाल वर्गों को कैसे उपयोग कर सकता हूं? कन्स्ट्रक्टर फ़ंक्शन बनाम फ़ैक्टरी फ़ंक्शन MySQL यूनिक्स टाइमस्टैम्प के लिए डेटटाइम कन्वर्ट करते हैं पायथन के लिए Exif हेरफेर लाइब्रेरी जावास्क्रिप्ट फ़ंक्शन ऑर्डर: क्यों यह फ़र्क पड़ता है? सी ++ में आप किस प्रकार की एन्यूम का उपयोग कर रहे हैं?

आवधिक आईओएस पृष्ठभूमि स्थान अपडेट

मैं एक आवेदन लिख रहा हूं जिसके लिए पृष्ठभूमि सटीकता और कम आवृत्ति के साथ पृष्ठभूमि अपडेट की आवश्यकता है। समाधान एक पृष्ठभूमि NSTimer कार्य लगता है जो स्थान प्रबंधक के अपडेट शुरू करता है, जो तब तुरंत बंद हो जाता है। इस सवाल से पहले पूछा गया है:

मैं अपने आईओएस एपिसोड में प्रत्येक एन मिनट में पृष्ठभूमि स्थान कैसे अपडेट कर सकता हूं?

ऐप पृष्ठभूमि पर जाता है के बाद उपयोगकर्ता स्थान प्राप्त करना हर मिनट

आईओएस ठेठ पृष्ठभूमि स्थान ट्रैकिंग टाइमर समस्या नहीं है

"स्थान" पृष्ठभूमि मोड के साथ आईओएस लंबे समय से चलने वाली पृष्ठभूमि टाइमर

स्थान ट्रैकिंग पर आधारित आईओएस पूर्णकालिक पृष्ठभूमि सेवा

लेकिन मेरे पास अभी तक एक न्यूनतम उदाहरण काम करना है ऊपर दिए गए उत्तरों के हर क्रम-निर्धारण की कोशिश करने के बाद, मैंने एक प्रारंभिक बिंदु को एक साथ रखा। पृष्ठभूमि दर्ज करना:

- (void)applicationDidEnterBackground:(UIApplication *)application { self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ NSLog(@"ending background task"); [[UIApplication sharedApplication] endBackgroundTask:self.bgTask]; self.bgTask = UIBackgroundTaskInvalid; }]; self.timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self.locationManager selector:@selector(startUpdatingLocation) userInfo:nil repeats:YES]; } 

और प्रतिनिधि विधि:

 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { NSLog(@"%@", newLocation); NSLog(@"background time: %f", [UIApplication sharedApplication].backgroundTimeRemaining); [self.locationManager stopUpdatingLocation]; } 

वर्तमान व्यवहार यह है कि 180 सेकंड से लेकर शून्य तक backgroundTimeRemaining टाइम रिमैनिंग कम हो जाती है, और फिर समाप्ति हैंडलर निष्पादित हो जाता है और कोई और स्थान अपडेट नहीं उत्पन्न होता है। पृष्ठभूमि में आवधिक स्थान अपडेट अनिश्चित काल तक प्राप्त करने के लिए मैं ऊपर कोड कैसे संशोधित करूं?

अद्यतन : मैं आईओएस 7 को लक्षित कर रहा हूं और ऐसा कुछ प्रतीत होता है कि पृष्ठभूमि कार्य अलग तरीके से व्यवहार करते हैं:

पृष्ठभूमि कार्य से iOS 7 में स्थान प्रबंधक प्रारंभ करें

वेब के समाधान से एकत्रित समाधान "आवधिक आईओएस पृष्ठभूमि स्थान अपडेट"

ऐसा लगता है कि stopUpdatingLocation पृष्ठभूमि वॉचडॉग टाइमर को ट्रिगर करता है, इसलिए मैंने इसके साथ didUpdateLocation में जगह दी:

 [self.locationManager setDesiredAccuracy:kCLLocationAccuracyThreeKilometers]; [self.locationManager setDistanceFilter:99999]; 

जो कि प्रभावी ढंग से जीपीएस के नीचे प्रतीत होता है पृष्ठभूमि NSTimer लिए चयनकर्ता तब बन जाता है:

 - (void) changeAccuracy { [self.locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; [self.locationManager setDistanceFilter:kCLDistanceFilterNone]; } 

मैं जो कुछ कर रहा हूं, वह समय-समय पर प्रत्येक कुछ मिनटों में उच्च-सटीकता समन्वय करने की सटीकता को टॉगल करता है और क्योंकि locationManager प्रबंधक को रोक नहीं दिया गया है, backgroundTimeRemaining समय-निर्धारण इसके अधिकतम मूल्य पर रहता है। यह मेरे डिवाइस पर ~ 10% प्रति घंटा (पृष्ठभूमि में निरंतर kCLLocationAccuracyBest ) से ~ 2% प्रति घंटे तक की बैटरी की खपत कम करती है

मैंने स्थान सेवाओं का उपयोग कर एक ऐप को लिखा था, ऐप को हर 10 में स्थान भेजना होगा और यह बहुत अच्छी तरह से काम किया।

ऐप्पल के डॉक्टर के अनुसरण में, "अनुमति देंवितरण स्थान अद्यतन अपरिवर्तितः टाइमआउट " विधि का उपयोग करें।

निम्न प्रकार हैं:

आवश्यक: अद्यतन स्थान के लिए पृष्ठभूमि मोड रजिस्टर करें।

1. लोकेशन मैनेजर बनाएं और स्टार्टअपडेटिंग स्थान, सटीकता और फ़िल्टर्ड डिस्टेंस के साथ जो चाहे आप चाहते हैं:

 -(void) initLocationManager { // Create the manager object self.locationManager = [[[CLLocationManager alloc] init] autorelease]; _locationManager.delegate = self; // This is the most important property to set for the manager. It ultimately determines how the manager will // attempt to acquire location and thus, the amount of power that will be consumed. _locationManager.desiredAccuracy = 45; _locationManager.distanceFilter = 100; // Once configured, the location manager must be "started". [_locationManager startUpdatingLocation]; } 

2. पृष्ठभूमि में ऐप को "allowDeferredLocationUpdatesUntilTraveled: timeout" विधि का उपयोग करने के लिए हमेशा रखने के लिए, आपको ऐप को पृष्ठभूमि में स्थानांतरित करते समय नए पैरामीटर के साथ अपडेट करना होगा, जैसे:

 - (void)applicationWillResignActive:(UIApplication *)application { _isBackgroundMode = YES; [_locationManager stopUpdatingLocation]; [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; [_locationManager setDistanceFilter:kCLDistanceFilterNone]; _locationManager.pausesLocationUpdatesAutomatically = NO; _locationManager.activityType = CLActivityTypeAutomotiveNavigation; [_locationManager startUpdatingLocation]; } 

3. ऐप को "लोकेशन प्रबंधक: किया अपडेट लॉज़ेशन:" कॉलबैक के साथ सामान्य रूप से अपडेट किए गए स्थान प्राप्त होते हैं:

 -(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { // store data CLLocation *newLocation = [locations lastObject]; self.userLocation = newLocation; //tell the centralManager that you want to deferred this updatedLocation if (_isBackgroundMode && !_deferringUpdates) { _deferringUpdates = YES; [self.locationManager allowDeferredLocationUpdatesUntilTraveled:CLLocationDistanceMax timeout:10]; } } 

4. लेकिन आपको "locationManager: didFinishDeferredUpdatesWithError:" डेटा को अपने उद्देश्य के लिए कॉलबैक करना चाहिए

 - (void) locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error { _deferringUpdates = NO; //do something } 

5. नोट: मुझे लगता है कि हम हर समय LocationManager के पैरामीटर को रीसेट करना चाहिए, पृष्ठभूमि / फ़ोरफ़ोन मोड के बीच ऐप स्विच होता है।

  1. यदि आपके पास location कुंजी के साथ अपने plist में UIBackgroundModes है तो आपको beginBackgroundTaskWithExpirationHandler विधि का उपयोग करने की आवश्यकता नहीं है। यह बेमानी है इसके अलावा आप इसे गलत तरीके से उपयोग कर रहे हैं (देखें यहां ), लेकिन इसके चालन के बाद से यह महत्वपूर्ण है।

  2. UIBackgroundModes location साथ plist में ऐप पृष्ठभूमि में अनिश्चित काल तक चलने के लिए जारी रहेगा जब तक CLLocationManger चल रहा है। यदि आप पृष्ठभूमि में stopUpdatingLocation करते समय स्थान stopUpdatingLocation करते हैं तो ऐप बंद हो जाएगा और फिर से शुरू नहीं होगा।

    हो सकता है कि आप beginBackgroundTaskWithExpirationHandler कर सकते beginBackgroundTaskWithExpirationHandler बस beginBackgroundTaskWithExpirationHandler को कॉल beginBackgroundTaskWithExpirationHandler से पहले और फिर शुरू करने के बाद कॉल करने के बाद स्थान startUpdatingLocation आप जीपीएस बंद होने पर इसे पृष्ठभूमि में रखने के लिए endBackgroundTask को कॉल कर सकते हैं, लेकिन मैंने कभी ऐसा नहीं किया – यह केवल एक विचार है

    एक अन्य विकल्प (जो मैंने कोशिश नहीं किया है) पृष्ठभूमि में चलने वाले स्थान प्रबंधक को रखने के लिए है, लेकिन एक बार जब आप एक सटीक स्थान प्राप्त करते हैं, तो desiredAccuracy अचल संपत्ति को 1000 desiredAccuracy या उच्चतम जीपीएस चिप को बंद करने के लिए अनुमति देता है (बैटरी को बचाने के लिए) । फिर 10 मिनट बाद जब आपको किसी अन्य स्थान की आवश्यकता होती है, तब तक जीपीएस चालू करने के लिए desiredAccuracy वापस 100 मीटर में बदल दें, जब तक आप एक सटीक स्थान प्राप्त न करें, दोहराएँ।

  3. जब आप startUpdatingLocation स्थान को स्थान प्रबंधक पर कॉल करते हैं तो आपको उसे स्थिति प्राप्त करने के लिए समय देना होगा। आपको तुरंत stopUpdatingLocation कॉल नहीं करना चाहिए। हम इसे अधिकतम 10 सेकंड तक चलाने या जब तक हम एक गैर कैश्ड उच्च सटीकता स्थान प्राप्त नहीं करते हैं।

  4. आपको कैश किए गए स्थानों को फ़िल्टर करना और उस स्थान की सटीकता की जांच करना होगा जो आप सुनिश्चित करने के लिए करते हैं कि यह आपकी न्यूनतम आवश्यक सटीकता ( यहां देखें) को पूरा करता है। आपको पहला अपडेट 10 मिनट या 10 दिन का हो सकता है। आपको मिले पहली सटीकता 3000 मीटर हो सकती है

  5. इसके बजाय महत्वपूर्ण स्थान परिवर्तन API का उपयोग करने पर विचार करें। एक बार जब आप महत्वपूर्ण परिवर्तन सूचना प्राप्त करते हैं, तो आप उच्च सटीकता की स्थिति प्राप्त करने के लिए कुछ सेकंड के लिए CLLocationManager शुरू कर सकते हैं। मैं निश्चित नहीं हूं, मैंने कभी भी महत्वपूर्ण स्थान परिवर्तन सेवाओं का इस्तेमाल नहीं किया है

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

एक कोकोपोड एपीएसडियल्डडॉलिशन मैनेजर है जो पृष्ठभूमि स्थान अपडेट्स को प्रत्येक एन सेकंड्स को वांछित स्थान सटीकता के साथ प्राप्त करने की अनुमति देता है।

 let manager = APScheduledLocationManager(delegate: self) manager.startUpdatingLocation(interval: 170, acceptableLocationAccuracy: 100) 

रिपॉजिटरी में स्विफ्ट 3 में लिखा गया एक उदाहरण ऐप भी है

इसे startMonitoringSignificantLocationChanges: करने की कोशिश करने के बारे में कैसे? startMonitoringSignificantLocationChanges: एपीआई? यह निश्चित रूप से कम आवृत्ति के साथ आग और सटीकता काफी अच्छा है। साथ ही इसके पास अन्य locationManager प्रबंधक एपीआई का उपयोग करने के मुकाबले बहुत अधिक फायदे हैं I

इस लिंक पर इस बारे में बहुत अधिक चर्चा हुई है

आप info.plist में निम्न कुंजी को जोड़कर अपने एप्लिकेशन में स्थान अपडेट मोड जोड़ना चाहते हैं।

 <key>UIBackgroundModes</key> <array> <string>location</string> </array> 

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

यह परियोजना पृष्ठभूमि में स्थान का प्रबंधन करने के लिए काम करेगी।

स्थान पृष्ठभूमि अपडेट

स्वचालित रूप से प्रबंधित होगा यदि ऐप पृष्ठभूमि में प्रवेश करेगा और स्थान अपडेट करने के लिए नेटवर्क कॉल भेजने की आवश्यकता होगी।