2012-03-16 8 views
45

मैं पृष्ठभूमि स्थिति में प्रवेश करते समय 10 मिनट से अधिक समय तक आईओएस ऐप को सक्रिय स्थिति में रखने की कोशिश कर रहा हूं।पृष्ठभूमि में 10 मिनट से अधिक समय के लिए ऐप चलाएं

मैं इसे कैसे कार्यान्वित कर सकता हूं।

+0

के संभावित डुप्लिकेट [iOS4 पृष्ठभूमि टाइमर बनाएं] (http://stackoverflow.com/questions/4154332/ios4-create-background-timer) –

+0

@ RichardJ.RossIII nop, जब वह पृष्ठभूमि में होता है, तो पृष्ठभूमि थ्रेड में नहीं, वह कोड चलाने के लिए चाहता है। – fbernardo

उत्तर

54

iPhoneAppProgrammingGuide के "पृष्ठभूमि निष्पादन" अनुभाग देखें। संक्षेप में, अपने अनुप्रयोग इन प्रकारों में से एक होना चाहिए:

  • ऐसे ऐप्स जो उपयोगकर्ता के लिए श्रव्य सामग्री को चलाने जबकि इस तरह के एक म्यूजिक प्लेयर एप्लिकेशन के रूप में पृष्ठभूमि, में
  • Apps का है कि उपयोगकर्ताओं को रखने के सब पर अपने स्थान के बारे में बताया कि इंटरनेट प्रोटोकॉल (वीओआईपी)
  • एप्लिकेशन जो बाहरी सामान से नियमित रूप से अपडेट प्राप्त डाउनलोड करने और नई सामग्री की प्रक्रिया पूरी की है कि
  • न्यूज़स्टैंड एप्लिकेशन से अधिक आवाज का समर्थन इस तरह के एक नेविगेशन एप्लिकेशन
  • Apps के रूप में कई बार,

और इस प्रकार आप Info.plist को जोड़ना होगा: अपने Info.plist फ़ाइल के लिए UIBackgroundModes कुंजी जोड़ें और एक सरणी में एक या अधिक निम्न तार की युक्त करने के लिए अपने मूल्य सेट करें:

  • ऑडियो-ऐप पृष्ठभूमि में उपयोगकर्ता को श्रव्य सामग्री बजाता है। (इस सामग्री में एयरप्ले का उपयोग कर ऑडियो या वीडियो सामग्री स्ट्रीमिंग शामिल है।)
  • स्थान-ऐप उपयोगकर्ताओं को पृष्ठभूमि में चलते समय भी उनके स्थान के बारे में सूचित करता है।
  • वीओआईपी-ऐप उपयोगकर्ता को इंटरनेट कनेक्शन का उपयोग करके फोन कॉल करने की क्षमता प्रदान करता है।
  • न्यूज़स्टैंड-सामग्री-ऐप एक न्यूजस्टैंड ऐप है जो पृष्ठभूमि में डाउनलोड और प्रक्रिया मैगज़ीन या समाचार पत्र सामग्री है।
  • बाहरी-एक्सेसरी-ऐप एक हार्डवेयर सहायक के साथ काम करता है जिसे बाहरी एक्सेसरी फ्रेमवर्क के माध्यम से नियमित शेड्यूल पर अपडेट वितरित करने की आवश्यकता होती है।
  • ब्लूटूथ केंद्रीय एप्लिकेशन के तहत एक ब्लूटूथ गौण CoreBluetooth ढांचे के माध्यम से एक नियमित समय पर अद्यतन वितरित करने के लिए

नोट समीक्षा प्रक्रिया का वह हिस्सा अपने अनुप्रयोग है कि सुनिश्चित करने के लिए जाँच की जाएगी की जरूरत है कि साथ काम करता है यह करता है कि यह पृष्ठभूमि प्रसंस्करण के संबंध में क्या कर रहा है।

+2

ध्यान दें कि इन प्रकारों को सेट करने से ऐप को जीवित नहीं रखा जाएगा। उदाहरण के लिए: जब आप ऑडियो खेल रहे हों, तो यह संगीत के दौरान जीवित रहेगा। लेकिन जब आपका गीत समाप्त होता है, तो ऐप को अभी भी निलंबित कर दिया जा सकता है। – Jelle

+0

अगर मैं एक अलार्म चलाने के लिए चाहता हूं, अधिसूचना प्राप्त हो जाने के बाद, जब मैं पृष्ठभूमि में होता हूं, तो मैं संगीत कैसे चला सकता हूं ?? इस बार अवधि 1 घंटे –

+0

@ श्री जी हो सकती है: आपको अभी तक आपकी समस्या का समाधान मिला है? –

2

पृष्ठभूमि में केवल कुछ प्रकार के ऐप्स चलाने की अनुमति है। this guide के "लंबे समय तक चलने वाले पृष्ठभूमि कार्य" अनुभाग को देखें।

यदि आप पृष्ठभूमि प्रसंस्करण करने की अनुमति का अनुरोध नहीं कर रहे हैं तो आप यूआईपीप्लिकेशंस के beginBackgroundTaskWithExpirationHandler का उपयोग कर सकते हैं लेकिन आपको अतिरिक्त समय नहीं मिल सकता है।

+0

नहीं मिला। कृपया अद्यतन करें। –

0

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

यदि आपको केवल उपयोगकर्ता को सूचित करने की आवश्यकता है, तो आप पुश नोटिफिकेशन का उपयोग कर सकते हैं।

19

यहां मैंने beginBackgroundTaskWithExpirationHandler का उपयोग करके किया है।

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

यह समाधान वास्तव में आदर्श नहीं है और अभी भी भूख लगी है लेकिन आप जो चाहते हैं वह करेंगे।

संपादित करें: आईओएस 7 के बाद से, मेरा सुझाव है कि आप यह excellent post पढ़ लें।

+2

क्या ऐप्पल ने ऐप स्टोर के लिए इस ऐप को मंजूरी दी थी? – Hope4You

+1

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

+0

मैं मूल रूप से ऐप को जीवित रखने के लिए जीपीएस का उपयोग करने जा रहा था, लेकिन यह विधि मेरे लिए बेहतर है, क्योंकि तब मुझे व्यक्ति के स्थान का उपयोग करने के लिए पूछना नहीं है। अपने परिदृश्य को समझाने के लिए बहुत बहुत धन्यवाद। – Hope4You

2

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

// @interface 

// Declare Private property 
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask; 

//@end 
// ... 

// Copy into 
//@implementation 

- (void)setupBackgrounding { 
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appBackgrounding:) 
               name: UIApplicationDidEnterBackgroundNotification 
               object: nil]; 
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(appForegrounding:) 
               name: UIApplicationWillEnterForegroundNotification 
               object: nil]; 
} 

- (void)appBackgrounding: (NSNotification *)notification { 
    [self keepAlive]; 
} 

- (void) keepAlive { 
    self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
     [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; 
     self.backgroundTask = UIBackgroundTaskInvalid; 
     [self keepAlive]; 
    }]; 
} 

- (void)appForegrounding: (NSNotification *)notification { 
    if (self.backgroundTask != UIBackgroundTaskInvalid) { 
     [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask]; 
     self.backgroundTask = UIBackgroundTaskInvalid; 
    } 
} 
+7

दुर्भाग्यवश, आईओएस 7 पर यह केवल मेरे लिए लगभग तीन मिनट तक काम करता है। – Jelle

+1

एक हैक –

+0

जैसा दिखता है वास्तव में बहुत सारे आईओटी वाणिज्यिक ऐप्स इसका उपयोग करते हैं। – rismay

0

https://github.com/yarodevuci/backgroundTask यहाँ मेरी कोड की जाँच करें मैं ऑडियो प्लेयर है कि लगभग 10 24 घंटे में% अवधि का उपयोग कैसे करें पूरी तरह से आईओएस 8 बैटरी उपयोग पर काम करता है खाली wav फ़ाइल निभाता उपयोग कर रहा हूँ:

var backgroundTask = BackgroundTask() 
backgroundTask.startBackgroundTask() //Starts playing blank audio file. You can run NSTimer() or whatever you need and it will continue executing in the background. 

backgroundTask.stopBackgroundTask() //Stops the task 

चेतावनी: यदि आप इसे सबमिट करने का प्रयास करते हैं तो ऐप्पल इसे अस्वीकार कर देगा!

0

यदि आपका ऐप प्रकार वीओआइपी/ऑडियो/स्थान में से एक .... (जाँच Background Modes) नहीं है,

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

Apps moving to the background are expected to put themselves into a quiescent state as quickly as possible so that they can be suspended by the system. If your app is in the middle of a task and needs a little extra time to complete that task, it can call the beginBackgroundTaskWithName:expirationHandler: or beginBackgroundTaskWithExpirationHandler: method of the UIApplication object to request some additional execution time. Calling either of these methods delays the suspension of your app temporarily, giving it a little extra time to finish its work. Upon completion of that work, your app must call the endBackgroundTask: method to let the system know that it is finished and can be suspended.

Each call to the beginBackgroundTaskWithName:expirationHandler: or beginBackgroundTaskWithExpirationHandler: method generates a unique token to associate with the corresponding task. When your app completes a task, it must call the endBackgroundTask: method with the corresponding token to let the system know that the task is complete. Failure to call the endBackgroundTask: method for a background task will result in the termination of your app. If you provided an expiration handler when starting the task, the system calls that handler and gives you one last chance to end the task and avoid termination.

0

मार्च 2018 की स्थिति के अनुसार, IOS 11.x पा सकते हैं वहाँ एक तरह से है कि मैं के बारे में पता विशेष प्रकार से एक होने के बिना अपने एप्लिकेशन पृष्ठभूमि में चल रहा रखने के लिए है। चाल, कि न दें NSURLSession द्वारा भूखा प्रतिनिधि कॉलबैक में एक नया DownloadTask बनाने

तो, रखने के अपने आवेदन को अनिश्चित काल चल रहा

  • एक पृष्ठभूमि NSURLSession बनाने रखने के लिए है

  • एक डमी डाउनलोड कार्य (डेटाटास्क नहीं), जिसमें http://localhost:12345/dummy.bin

  • लागू करें [- (शून्य) URL सत्र: (NSURL सत्र *) सत्र कार्य :(NSURLSessionTask *) कार्य किया गया पूर्णत: त्रुटि: (NSError *) त्रुटि] प्रतिनिधि और प्रतिनिधि में, एक और डमी डाउनलोड कार्य बनाएं और इसे [पुन: शुरू करें] से शुरू करें, अधिमानतः देरी के साथ।

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

नमूना कोड:

/* Author: Yi Wang @InstaTV */ 

@interface URLSessionKeepAlive() { 
    NSURLSession *_session; 
} 
@end 

@implementation URLSessionKeepAlive 

- (instancetype)init { 
    self = [super init]; 
    return self; 
} 

- (void)start { 
    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"SpecialKeepAliveIdentifier"]; 
    [sessionConfiguration setAllowsCellularAccess:YES]; 
    sessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData; 
    sessionConfiguration.timeoutIntervalForRequest = 3.0; 
    sessionConfiguration.timeoutIntervalForResource = 3.0; 
    sessionConfiguration.URLCache = nil; 
    _session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil]; 

    [self addTask]; 
} 

- (void)addTask { 
    NSURLSessionTask *task = [_session downloadTaskWithURL:[NSURL URLWithString:@"http://localhost:12345/dummy.bin"]]; 
    [task resume]; 
} 

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { 
    static NSInteger counter = 0; 

    if (error) { 
     NSLog(@"(%zd) Adding Keep Alive Task with error: '%@'", counter++, error); 
     [NSThread sleepForTimeInterval:3.0]; 
     [self addTask]; 
    } 
} 
संबंधित मुद्दे