दिलचस्प पोस्ट
क्या स्काला 2.8 संग्रह लाइब्रेरी "इतिहास में सबसे लंबे समय तक आत्महत्या नोट" का मामला है? पृष्ठभूमि प्रक्रिया के पीआईडी ​​कैसे प्राप्त करें? क्यों JPasswordField.getPassword () उस में पासवर्ड के साथ एक स्ट्रिंग बनाते हैं? Onclick घटना में एकाधिक जावास्क्रिप्ट कार्यों को कॉल करने के लिए कैसे? एक बैच फ़ाइल से एक exe के लिए एक शॉर्टकट बनाने दो से अधिक स्ट्रिंग्स से सबसे लंबे समय तक सामान्य सबस्ट्रिंग – पायथन imagebutton के साथ listview पंक्ति पर क्लिक नहीं कर सकते जैक्सन – जेनेरिक क्लास का इस्तेमाल करना PHP 7.2 में मैक्रिप को हटाने की तैयारी SQL सर्वर में डायनेमिक धुएं कॉलम प्रतिगमन कैफ के लिए टेस्ट लेबल, फ्लोट की अनुमति नहीं है? बटन पर क्लिक करने के बाद एक चेतावनी को खोलने के लिए कैसे निकाल दिया जाता है? क्या यह स्पष्ट रूप से बूलियन स्थिरांक से तुलना करना बुरा है जैसे जावा में (बी == गलत)? गैर स्थैतिक सदस्य आरंभकर्ताओं के साथ कक्षाओं के लिए सी + + 11 समग्र प्रारंभ एक कॉरस पोस्ट अनुरोध सादे जावास्क्रिप्ट से काम करता है, लेकिन क्यों नहीं jQuery के साथ?

आईफोन – घटनाओं के लिए मतदान के लिए पृष्ठभूमि

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

पिछले हफ्ते मैंने यह आवेदन पाया जो कि वास्तव में करता है। http://itunes.apple.com/us/app/dataman-real-time-data-usage/id393282873?mt=8

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

क्या किसी के पास यह पता चलता है कि यह कैसे पूरा किया जा सकता है?

वेब के समाधान से एकत्रित समाधान "आईफोन – घटनाओं के लिए मतदान के लिए पृष्ठभूमि"

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

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

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

// if the iOS device allows background execution, // this Handler will be called - (void)backgroundHandler { NSLog(@"### -->VOIP backgrounding callback"); // try to do sth. According to Apple we have ONLY 30 seconds to perform this Task! // Else the Application will be terminated! UIApplication* app = [UIApplication sharedApplication]; NSArray* oldNotifications = [app scheduledLocalNotifications]; // Clear out the old notification before scheduling a new one. if ([oldNotifications count] > 0) [app cancelAllLocalNotifications]; // Create a new notification UILocalNotification* alarm = [[[UILocalNotification alloc] init] autorelease]; if (alarm) { alarm.fireDate = [NSDate date]; alarm.timeZone = [NSTimeZone defaultTimeZone]; alarm.repeatInterval = 0; alarm.soundName = @"alarmsound.caf"; alarm.alertBody = @"Don't Panic! This is just a Push-Notification Test."; [app scheduleLocalNotification:alarm]; } } 

और पंजीकरण में किया जाता है

 - (void)applicationDidEnterBackground:(UIApplication *)application { // This is where you can do your X Minutes, if >= 10Minutes is okay. BOOL backgroundAccepted = [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ [self backgroundHandler]; }]; if (backgroundAccepted) { NSLog(@"VOIP backgrounding accepted"); } } 

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

डॉक्टर का कहना है कि ऐप रद्द कर दिया गया था, तो सभी पृष्ठभूमि कार्यों (वीओआईपी, ऑडियो, स्थान अपडेट) पृष्ठभूमि में स्वचालित रूप से पुनरारंभ हो जाएंगे। वीओआईपी एप्लिकेशन को बूटअप के बाद पृष्ठभूमि में स्वचालित रूप से शुरू किया जाएगा!

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

अब कुछ लिखिए "कार्य समाप्त करना है" कोड ऐप्पल के अनुसार आपके पास कुछ समय (5 सेकेंड?) काम खत्म करने के लिए छोड़े गए हैं मुझे पता चला, कि यह CPU समय होना चाहिए तो इसका मतलब है: यदि आप कुछ नहीं करते हैं, तो आपका ऐप अभी भी निष्पादित हो रहा है! ऐप्पल एक समाप्ति हड़ताल कॉल करने का सुझाव देते हैं, अगर आप अपने काम के साथ समाप्त हो गए हैं नीचे दिए गए कोड में आप देख सकते हैं, मेरे पास समाप्ति हेंडलर पर एक टिप्पणी है। यह आपके ऐप को तब तक चलाएगा जब तक कि सिस्टम आपके ऐप को चलने की अनुमति नहीं देता। आईओएस आपके ऐप को समाप्त होने तक सभी टाइमर और थ्रेड चल रहें।

 - (void)applicationDidEnterBackground:(UIApplication *)application { UIApplication* app = [UIApplication sharedApplication]; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ [app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }]; // Start the long-running task and return immediately. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // you can do sth. here, or simply do nothing! // All your background treads and timers are still being executed while (background) [self doSomething]; // This is where you can do your "X minutes" in seconds (here 10) sleep(10); } // And never call the expirationHandler, so your App runs // until the system terminates our process //[app endBackgroundTask:bgTask]; //bgTask = UIBackgroundTaskInvalid; }); } 

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

मुझे नहीं पता कि यह आपके द्वारा पहले वर्णित एप्लिकेशन के दृष्टिकोण से है, लेकिन यह मेरे लिए काम करता है

आशा है कि मैं मदद कर सकता हूँ

अद्यतन करें:

बीजी कार्य के समय को मापने के बाद, वहाँ एक आश्चर्य था बीजी टास्क 600 सेकंड तक सीमित है यह वीओआईपी न्यूनतम समय का सटीक न्यूनतम समय है (सेट कीपएलिव टाइमआउट: 600)।

तो यह कोड पृष्ठभूमि में "अनंत" निष्पादन की ओर जाता है:

हैडर:

 UIBackgroundTaskIdentifier bgTask; 

कोड:

 // if the iOS device allows background execution, // this Handler will be called - (void)backgroundHandler { NSLog(@"### -->VOIP backgrounding callback"); UIApplication* app = [UIApplication sharedApplication]; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ [app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }]; // Start the long-running task dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ while (1) { NSLog(@"BGTime left: %f", [UIApplication sharedApplication].backgroundTimeRemaining); [self doSomething]; sleep(1); } }); - (void)applicationDidEnterBackground:(UIApplication *)application { BOOL backgroundAccepted = [[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{ [self backgroundHandler]; }]; if (backgroundAccepted) { NSLog(@"VOIP backgrounding accepted"); } UIApplication* app = [UIApplication sharedApplication]; bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ [app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; }]; // Start the long-running task dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ while (1) { NSLog(@"BGTime left: %f", [UIApplication sharedApplication].backgroundTimeRemaining); [self doSomething]; sleep(1); } }); } 

आपके ऐप का समय समाप्त हो जाने के बाद, वीओआईपी समापनहैंडलर को बुलाया जाएगा, जहां आप एक लंबे समय से चलने वाले कार्य को पुनः आरंभ करते हैं यह कार्य 600 सेकंड के बाद समाप्त हो जाएगा। लेकिन फिर से समापन हेन्डलर के लिए एक कॉल होगा, जो एक और लंबे समय से चलने वाला कार्य शुरू करता है, आदि। अब आपको केवल मौसम को देखना होगा कि ऐप वापस अग्रभूमि में हो रहा है फिर bgTask बंद करें, और आप कर रहे हैं हो सकता है कि कोई भी एसटीएच कर सकता है लंबे समय से चल रहे कार्य से समापन समाप्ति के भीतर हेण्डलर। बस इसे बाहर की कोशिश करो अपने कंसोल का उपयोग करें, यह देखने के लिए कि क्या … मज़े!

अपडेट 2:

कभी-कभी चीजों को आसान बनाने में मदद करता है मेरा नया दृष्टिकोण यह है:

 - (void)applicationDidEnterBackground:(UIApplication *)application { UIApplication* app = [UIApplication sharedApplication]; // it's better to move "dispatch_block_t expirationHandler" // into your headerfile and initialize the code somewhere else // ie // - (void)applicationDidFinishLaunching:(UIApplication *)application { // // expirationHandler = ^{ ... } } // because your app may crash if you initialize expirationHandler twice. dispatch_block_t expirationHandler; expirationHandler = ^{ [app endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler]; }; bgTask = [app beginBackgroundTaskWithExpirationHandler:expirationHandler]; // Start the long-running task and return immediately. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // inform others to stop tasks, if you like [[NSNotificationCenter defaultCenter] postNotificationName:@"MyApplicationEntersBackground" object:self]; // do your background work here }); } 

यह वीओआईपी हैक के बिना काम कर रहा है। प्रलेखन के मुताबिक, समाप्ति हेन्डलर (इस मामले में मेरे 'समाप्ति हँडलर' ब्लॉक) निष्पादन का समय समाप्त होने पर निष्पादित होगा। ब्लॉक को एक ब्लॉक वैरिएबल में परिभाषित करके, एक समय-समय पर चलने वाले कार्य फिर से समाप्ति समय के भीतर पुन: शुरू कर सकता है। यह अंतहीन निष्पादन की ओर जाता है, भी

कार्य को समाप्त करने के बारे में जागरूक रहें, अगर आपका आवेदन फिर से अग्रभूमि में प्रवेश करता है और कार्य को समाप्त करें यदि आपको इसकी आवश्यकता नहीं है।

अपने अनुभव के लिए मैंने कुछ मापा जीपीएस रेडियो होने के साथ स्थान कॉलबैक का उपयोग करना मेरी बैटरी को बहुत जल्दी से चूसने में है अद्यतन 2 में पोस्ट किए गए दृष्टिकोण का उपयोग लगभग कोई ऊर्जा नहीं ले रहा है "उपयोगरक्षणात्मकता" के अनुसार यह एक बेहतर दृष्टिकोण है शायद अन्य ऐप्स इस तरह काम करते हैं, जीपीएस कार्यक्षमता के पीछे अपना व्यवहार छिपाते हैं …

क्या काम करता है और क्या नहीं करता है

यह पूरी तरह से स्पष्ट नहीं है कि इनमें से कौन से उत्तर काम करते हैं और मैंने बहुत समय बर्बाद कर दिया है, तो यहां प्रत्येक रणनीति के साथ मेरा अनुभव है:

  1. वीओआईपी हैक – काम करता है, लेकिन अगर आप वीओआईपी ऐप नहीं हैं तो आपको अस्वीकार कर दिया जाएगा
  2. पुनरावृत्त शुरू beginBackgroundTask... – काम नहीं करता है यह 10 मिनट के बाद छोड़ दिया जाएगा भले ही आप टिप्पणियों में सुधार की कोशिश करें (कम से कम 30 नवंबर, 2012 तक की टिप्पणियां)
  3. मौन ऑडियो – काम करता है, लेकिन इसके लिए लोगों को अस्वीकार कर दिया गया है
  4. लोकल / पुश नोटिफिकेशन – आपके ऐप से पहले उपयोगकर्ता इंटरैक्शन की आवश्यकता होती है
  5. पृष्ठभूमि स्थान का उपयोग करना – काम करता है यहाँ विवरण हैं:

असल में आप अपने ऐप को पृष्ठभूमि में चलने के लिए "स्थान" पृष्ठभूमि मोड का उपयोग करते हैं। यह काम करता है, भले ही उपयोगकर्ता स्थान अपडेट की अनुमति न दें। भले ही उपयोगकर्ता होम बटन दबाए और दूसरे ऐप को लॉन्च करता है, आपका ऐप अभी भी चल रहा होगा। यह भी एक बैटरी drainer है और स्वीकृति प्रक्रिया में एक खिंचाव हो सकता है अगर आपके ऐप का स्थान के साथ कुछ भी नहीं है, लेकिन जहां तक ​​मुझे पता है कि यह एकमात्र समाधान है जिसकी अनुमोदित होने का अच्छा मौका है

यहां देखिए यह कैसे काम करता है:

अपने प्लास्ट सेट में:

  • आवेदन पृष्ठभूमि में नहीं चलता है: नहीं
  • आवश्यक पृष्ठभूमि मोड: स्थान

फिर CoreLocation ढांचे (बिल्ड चरणों में) को संदर्भित करें और कहीं भी अपने ऐप में इस कोड को जोड़ें (इससे पहले कि वह पृष्ठभूमि में जाता है):

 #import <CoreLocation/CoreLocation.h> CLLocationManager* locationManager = [[CLLocationManager alloc] init]; [locationManager startUpdatingLocation]; 

नोट: startMonitoringSignificantLocationChanges काम नहीं करेगा।

यह भी उल्लेखनीय है कि यदि आपका ऐप क्रैश हो जाता है, तो आईओएस इसे वापस जीवन में वापस नहीं लाएगा वीओआइपी हैक केवल एक है जो इसे वापस ला सकता है।

पृष्ठभूमि में हमेशा के लिए रहने के लिए एक और तकनीक है – अपने पृष्ठभूमि कार्य में स्थान प्रबंधक को प्रारंभ / रोकना , पृष्ठभूमि के समय को रीसेट करेगा जब अपडेटटीओ स्थान: कहा जाता है।

मुझे नहीं पता कि यह क्यों काम करता है, लेकिन मुझे लगता है कि अपडेटटॉलोकेशन को एक कार्य के रूप में भी कहा जाता है और इससे टाइमर रीसेट होता है

परीक्षण के आधार पर, मुझे विश्वास है कि यह डेटामैं प्रो क्या प्रयोग कर रहा है।

इस पोस्ट को देखें https://stackoverflow.com/a/6465280 जहां से मुझे चाल है

यहां हमारे ऐप से कुछ परिणाम दिए गए हैं:

 2012-02-06 15:21:01.520 **[1166:4027] BGTime left: 598.614497 2012-02-06 15:21:02.897 **[1166:4027] BGTime left: 597.237567 2012-02-06 15:21:04.106 **[1166:4027] BGTime left: 596.028215 2012-02-06 15:21:05.306 **[1166:4027] BGTime left: 594.828474 2012-02-06 15:21:06.515 **[1166:4027] BGTime left: 593.619191 2012-02-06 15:21:07.739 **[1166:4027] BGTime left: 592.395392 2012-02-06 15:21:08.941 **[1166:4027] BGTime left: 591.193865 2012-02-06 15:21:10.134 **[1166:4027] BGTime left: 590.001071 2012-02-06 15:21:11.339 **[1166:4027] BGTime left: 588.795573 2012-02-06 15:21:11.351 **[1166:707] startUpdatingLocation 2012-02-06 15:21:11.543 **[1166:707] didUpdateToLocation 2012-02-06 15:21:11.623 **[1166:707] stopUpdatingLocation 2012-02-06 15:21:13.050 **[1166:4027] BGTime left: 599.701993 2012-02-06 15:21:14.286 **[1166:4027] BGTime left: 598.465553 

मैंने अपडेट 2 की कोशिश की लेकिन यह सिर्फ काम नहीं करता है जब समाप्ति हैंडलर कहा जाता है, यह पृष्ठभूमि कार्य को समाप्त करता है। फिर एक नया पृष्ठभूमि कार्य शुरू करने से सिर्फ एक तत्काल कॉल की समाप्ति समाप्ति पर फिर से बाध्य होती है (टाइमर रीसेट नहीं है और अभी भी समाप्त हो गया है)। इस प्रकार ऐप के निलंबित होने से पहले मुझे पृष्ठभूमि कार्यों के 43 शुरू / स्टॉप मिले।

यदि यह जीपीएस नहीं है तो मुझे लगता है कि ऐसा करने का एकमात्र दूसरा तरीका पृष्ठभूमि संगीत समारोह है, यानी, यह सक्षम होने पर 4 "33" खेलता है। पृष्ठभूमि प्रोसेसिंग एपीआई के दुरुपयोग की तरह कुछ ध्वनि और इतनी संभावित समीक्षा प्रक्रिया की सनक के अधीन।

IOS5 पर मेरे परीक्षण में पाया कि यह CoreLocation की मॉनिटरिंग प्रारंभ करने के लिए मदद करता है, प्रारंभ मॉनिटरिंगफॉरलाकेशन चेंज एवेंट्स (महत्वपूर्ण स्थान परिवर्तन नहीं) के माध्यम से, सटीकता को कोई फर्क नहीं पड़ता है और यहां तक ​​कि आइपॉड पर भी ऐसा ही होता है – पृष्ठभूमि टाइमरेमिंग कभी नीचे नहीं जाती है