2010-10-16 19 views
6

मैं अपने ऐप को स्थान सेवाओं के साथ पृष्ठभूमि में चलना चाहता हूं। इसके लिए मैं का इस्तेमाल किया है:पृष्ठभूमि में लगातार एप चलाने के लिए

-(void)applicationDidEnterBackground:(UIApplication *)application { 

    [locationManager stopUpdatingLocation]; 
    [locationManager startUpdatingLocation]; 

    //timer=[NSTimer scheduledTimerWithTimeInterval:300 target:self selector:@selector(UpdateLocation) userInfo:nil repeats:YES]; 

} 

लेकिन जब मैं NSTimer का उपयोग यह UpdateLocation फोन नहीं करता है। मैंने इसे किसी अन्य विधि का उपयोग करने की कोशिश की लेकिन फिर इसे केवल एक बार भी बुलाया गया।

मैं नियमित रूप से समय के अंतराल के बाद स्थानों का पता लगाने, पृष्ठभूमि में लगातार ऐप चलाने के लिए चाहता हूं।

उत्तर

5

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

सबसे पहले, अपने ऐप की info.plist में कुंजी 'पृष्ठभूमि मोड' के लिए 'स्थान' ऑब्जेक्ट जोड़ें। अब, तुम क्या करने की जरूरत है अपने एप्लिकेशन में कहीं स्थान अद्यतन शुरू है:

CLLocationManager locationManager = [[CLLocationManager alloc] init]; 

locationManager.delegate = self;//or whatever class you have for managing location 

[locationManager startUpdatingLocation]; 

इसके बाद, स्थान अपडेट प्रबंधित करने की एक विधि लिखते हैं, कहते हैं - (शून्य) didUpdateToLocation: (CLLocation *) स्थान, में ऐप प्रतिनिधि। फिर विधि स्थान लागू करें प्रबंधक: didUpdateLocation: कक्षा में CLLocationManagerDelegate का स्थान जिसमें आपने स्थान प्रबंधक प्रारंभ किया था (चूंकि हम स्थान प्रबंधक प्रतिनिधि को 'स्वयं' पर सेट करते हैं)। इस विधि के अंदर आपको यह जांचने की आवश्यकता है कि समय अंतराल के बाद आपको स्थान अपडेट को संभालना है या नहीं। आप हर बार वर्तमान समय को सहेजकर ऐसा कर सकते हैं। कि समय बीत चुका है, तो अपने अनुप्रयोग प्रतिनिधि से विधि UpdateLocation फोन:

NSDate *newLocationTimestamp = newLocation.timestamp; 
NSDate *lastLocationUpdateTiemstamp; 

int locationUpdateInterval = 300;//5 mins 

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
if (userDefaults) { 

     lastLocationUpdateTiemstamp = [userDefaults objectForKey:kLastLocationUpdateTimestamp]; 

     if (!([newLocationTimestamp timeIntervalSinceDate:lastLocationUpdateTiemstamp] < locationUpdateInterval)) { 
      //NSLog(@"New Location: %@", newLocation); 
      [(AppDelegate*)[UIApplication sharedApplication].delegate didUpdateToLocation:newLocation]; 
      [userDefaults setObject:newLocationTimestamp forKey:kLastLocationUpdateTimestamp]; 
     } 
    } 
} 

यह आपके विधि हर 5 मिनट फोन करेगा, भले ही आपका एप्लिकेशन को पृष्ठभूमि में है। Imp: इस कार्यान्वयन बैटरी नालियों, अगर आपके स्थान डेटा की सटीकता महत्वपूर्ण आप का उपयोग करना चाहिए नहीं है [locationManager startMonitoringSignificantLocationChanges]

अपने अनुप्रयोग को यह जोड़ने से पहले, कृपया पर http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html

+0

यदि मुझे गलत नहीं लगता है, तो यह केवल प्रत्येक 5 मिनट में अपडडेट टोलोकेशन को कॉल करेगा यदि नियमित छोटे अंतराल पर अद्यतन किया जाता है। यदि आप startMonitoringSignificantChanges का चयन करते हैं और अधिक स्थानांतरित नहीं करते हैं, तो आपको 5 एमएन अंतराल पर अपडेट नहीं मिलेगा। सही बात? – Lolo

0

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

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    UIApplication *app = [UIApplication sharedApplication]; 
    UIBackgroundTaskIdentifier bgTask = 0; 

    backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(backgroundTask) userInfo:nil repeats:YES]; 

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:bgTask]; 
    }]; 
} 

अब जो कुछ भी आप backgroundTask विधि में चाहते हैं।

+0

क्या यह ऐपडिलेगेट में स्थित है, या यह किसी भी कक्षा में हो सकता है? – anthoprotic

+0

हाँ, यह कोड AppDelegate में है। और मैंने इसे स्वयं नहीं किया है, लेकिन इसे किसी भी अन्य वर्ग में भी काम करना चाहिए ... –

+0

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

0

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

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    UIApplication *app = [UIApplication sharedApplication]; 
    UIBackgroundTaskIdentifier bgTask = 0; 

    backgroundTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(backgroundTask) userInfo:nil repeats:YES]; 

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:bgTask]; 
    }]; 
} 
+0

यह वही समाधान है जो @ Vish_Obj-C पहले पोस्ट किया गया था। मैं क्या खो रहा हूँ? – smholloway

+0

कोड गलत दिखता है। जब यह बनाया गया है, तो ब्लॉक 'bgTask' के मान को कैप्चर करेगा, जो 0 है, जो गलत है [ऐप एंडबैकग्राउंड टास्क: 0] '। इसके बजाय, आप शायद एक bgTaskID ivar/संपत्ति चाहते हैं, तो असाइनमेंट ब्लॉक को प्रचारित कर सकता है। –

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

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