2013-04-16 5 views
5

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

को लागू करने लंबे समय से चल पृष्ठभूमि कार्य

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

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

Apps का है कि उपयोगकर्ताओं को रखने के बारे में बताया हर समय उनके स्थान, जैसे एक नेविगेशन

एप्लिकेशन जो इंटरनेट प्रोटोकॉल (वीओआईपी) डाउनलोड करने और नई सामग्री एप्लिकेशन जो प्राप्त संसाधित करने की जरूरत है कि

न्यूज़स्टैंड एप्लिकेशन से अधिक आवाज का समर्थन एप्लिकेशन बाहरी सामान से नियमित रूप से अपडेट

Apps कि इन सेवाओं को लागू उन सेवाओं के प्रासंगिक पहलुओं को लागू करने की सेवाओं वे समर्थन और उपयोग प्रणाली चौखटे घोषित करना चाहिए। सेवाओं को घोषित करने से सिस्टम को पता चलता है कि आप किस सेवाओं का उपयोग करते हैं, लेकिन कुछ मामलों में यह सिस्टम फ्रेमवर्क है कि वास्तव में आपके एप्लिकेशन को निलंबित होने से रोकता है।

- (void)viewDidLoad { 
      [super viewDidLoad]; 

     counterTask = [[UIApplication sharedApplication] 
         beginBackgroundTaskWithExpirationHandler:^{ 

         }]; 
       count=0; 

     theTimer=[NSTimer scheduledTimerWithTimeInterval:0.1 
                target:self 
               selector:@selector(countUp) 
               userInfo:nil 
               repeats:YES]; 
     } 
    - (void)countUp { 

     { 
      count++; 
      NSString *currentCount; 
      currentCount=[[NSString alloc] initWithFormat:@"%ld",count]; 
      theCount.text=currentCount; 
      [currentCount release]; 
     } 
     } 

एक अन्य प्रश्न: मैं एक iOS एप्लिकेशन हमेशा के लिए पृष्ठभूमि में चलाने की है सकते हैं?

---- स्थान जोड़ने के लिए संपादित कोड, अभी भी 10 मिनट से अधिक समय तक नहीं चलता है, मैं क्या गलत कर रहा हूं?

- (void)viewDidLoad { 
    [super viewDidLoad]; 

count=0; 

locationManager = [[CLLocationManager alloc] init]; 
locationManager.delegate = self; 
locationManager.distanceFilter = kCLDistanceFilterNone; 
locationManager.desiredAccuracy = kCLLocationAccuracyBest; 

[locationManager startUpdatingLocation]; 

counterTask = [[UIApplication sharedApplication] 
       beginBackgroundTaskWithExpirationHandler:^{ 
        // If you're worried about exceeding 10 minutes, handle it here 

        [locationManager startUpdatingLocation]; 
       }]; 
theTimer=[NSTimer scheduledTimerWithTimeInterval:0.1 
              target:self 
             selector:@selector(countUp) 
             userInfo:nil 
             repeats:YES]; 

} 



    (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
NSLog(@"OldLocation %f %f", oldLocation.coordinate.latitude, oldLocation.coordinate.longitude); NSLog(@"NewLocation %f %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude); 

    count++; NSString *currentCount; 
currentCount=[[NSString alloc] initWithFormat:@"%ld",count]; 
theCount.text=currentCount; [currentCount release]; 
} 

    (void)countUp { [locationManager startUpdatingLocation]; 
{ count++; NSString *currentCount; 
currentCount=[[NSString alloc] initWithFormat:@"%ld",count]; 
theCount.text=currentCount; 
[currentCount release]; } } 
+0

आपने निर्दिष्ट किया है कि यदि आप ऐप उन श्रेणियों में से किसी एक में नहीं आते हैं तो आप पृष्ठभूमि में भाग सकते हैं तो आप भाग्य से बाहर हैं। आपको ऐप को पृष्ठभूमि में हमेशा के लिए चलाने का कोई तरीका नहीं है। ऐप्पल इसकी अनुमति नहीं देगा क्योंकि यह बैटरी जीवन को मार देगा। न ही मैं एक उपयोगकर्ता के रूप में कभी इस तरह एक ऐप चाहता हूँ। आपके ऐप को हर समय क्यों चलाना होगा ??? – rckoenes

+0

यह निर्दिष्ट श्रेणियों के तहत विशेष रूप से (ऐप्स जो उपयोगकर्ताओं को अपने स्थान के बारे में सूचित करता है, जैसे नेविगेशन ऐप) जब मैं कोड पृष्ठभूमि कार्यों का परीक्षण केवल 10 मिनट तक रहता हूं, तो क्या मुझे स्थान का उपयोग करना चाहिए सिर्फ काउंटर के बजाय परीक्षण? – Ahmad

+0

यदि आप पृष्ठभूमि में स्थान का उपयोग करते हैं, तो आपको प्रमुख स्थान परिवर्तन प्राप्त करने के लिए 'CLLocationManager' शुरू करना चाहिए। फिर जब उपयोगकर्ता स्थान बदलता है तो आपके ऐप को सूचित किया जाएगा। – rckoenes

उत्तर

4

तो आपका ऐप स्थान सेवाओं का उपयोग करता है। फिर Location Awareness Programming Guide पढ़ें।

आप अपने Info.plist में कुछ परिवर्तन करने की जरूरत है:

  • अपने अनुप्रयोग स्थान सेवाओं पर निर्भर करता है, तो ठीक ढंग से काम करने के लिए, UIRequiredDeviceCapabilities
  • को location-services जोड़ने कि आपके ऐप में जीपीएस हार्डवेयर की आवश्यकता है, के लिए gps जोड़ने UIRequiredDeviceCapabilities
  • यदि आपको अपने ऐप अब तो पृष्ठभूमि में 10 मिनट चलाने के लिए की जरूरत है, UIBackgroundModes को location जोड़ें। फिर आपका स्थान प्रबंधक 10 मिनट की सीमा से परे स्थानों को वितरित करेगा।
  • आप भी NSLocationUsageDescription (भी स्थानीय किया जा सकता है)

पृष्ठभूमि में हो रही स्थान घटनाक्रम स्थापित करना चाहिए

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

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

+0

उत्तर के लिए धन्यवाद, मैं परिवर्तन आप लेखन की वजह से है, लेकिन मुझे नहीं पता था कि कैसे अंतिम बिंदु करने के लिए कृपया यह भी मेरे ऊपर कोड जाँच (आप भी (भी स्थानीय जा सकता है) NSLocationUsageDescription स्थापित करना चाहिए) आप के लिए एक बहुत धन्यवाद आपकी मदद – Ahmad

+0

बहुत बहुत धन्यवाद, समस्या ठीक हो गई है: डी – Ahmad

+0

@ahmadNazmi इस उत्तर का संदर्भ लें http://stackoverflow.com/a/12582916/550177 – Felix

1
जानकारी के लिए

phix23 के देखें जवाब (और प्रलेखन), लेकिन यहाँ मैं समझाने के लिए आपको क्या होने की उम्मीद कर सकते हैं चाहता हूँ।

यह सब कुछ दस्तावेज में शामिल है जो आपने उद्धृत किया है।

कोई भी एप्लिकेशन पृष्ठभूमि में दस मिनट तक चला सकता है। beginBackgroundTaskWithExpirationHandler: विधि यही है। कोई फर्क नहीं पड़ता कि आप कौन से झंडे और विकल्प सेट करते हैं, यह सब आप उस विधि का उपयोग कर लेंगे।

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

+0

आपको बहुत धन्यवाद, समस्या ठीक हो गई है: डी – Ahmad

0

वैसे, अपने plist में आप एएलओ Required background modes सेट कर सकते हैं और फिर Item0 App registers for location updates

+0

आपको बहुत धन्यवाद बहुत :) – Ahmad

1

में applicationDidEnterBackground विधि में निम्नलिखित को जोड़ कर, ऐसा लगता है कि यह हमेशा के लिए निष्पादित कर सकते हैं:

[app beginBackgroundTaskWithExpirationHandler:^{}]; 

फिर आप willEnterForeground में लंबे कार्य को अमान्य कर देते हैं।

मैं हाल ही में आईओएस 6 में सफल हूं, लेकिन मुझे यकीन नहीं है कि इसे स्टोर के लिए स्वीकृति दी जाएगी।

+0

निश्चित रूप से स्टोर के लिए अनुमोदित नहीं किया जाएगा। हालांकि अच्छा हैक! – braden

संबंधित मुद्दे