2012-04-19 11 views
26

मैं this post में दिए गए सुझावों को लागू करने का प्रयास कर रहा हूं।ऐप पृष्ठभूमि पर जाने के बाद प्रत्येक एन मिनट में उपयोगकर्ता स्थान प्राप्त करना

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

- (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), ^{ 

     // Do the work associated with the task. 
     self.timer = nil; 
     [self initTimer]; 

    }); 
} 

initTimer:

- (void)initTimer { 

    // Create the location manager if this object does not 
    // already have one. 
    if (nil == self.locationManager) 
     self.locationManager = [[CLLocationManager alloc] init]; 

    self.locationManager.delegate = self; 
    [self.locationManager startMonitoringSignificantLocationChanges]; 

    if (self.timer == nil) { 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:0.3 
               target:self 
              selector:@selector(checkUpdates:) 
              userInfo:nil 
              repeats:YES]; 
    } 
} 

checkUpdates:

- (void)checkUpdates:(NSTimer *)timer{ 
    UIApplication* app = [UIApplication sharedApplication]; 
    double remaining = app.backgroundTimeRemaining; 
    if(remaining < 580.0) { 
     [self.locationManager startUpdatingLocation]; 
     [self.locationManager stopUpdatingLocation]; 
     [self.locationManager startMonitoringSignificantLocationChanges]; 
    } 
    DbgLog(@"Reminaing %f", app.backgroundTimeRemaining); 
} 

किसी को क्या मेरी कोड में गलत हो सकता है पर एक सुझाव है? InitTimer और checkUpdates दोनों को बुलाया जा रहा है, लेकिन केवल पृष्ठभूमि निष्पादन समय (+ - 10 मिनट) के दौरान। मैं ऐप को "हमेशा के लिए" हर एन मिनट में स्थान अपडेट करना चाहता हूं।

मेरे ऐप का UIBackgroundModes स्थान पर सेट है।

अद्यतन:

मैं अब didUpdateToLocation और didFailWithError पर टाइमर को रीसेट कर रहा हूँ। लेकिन फिर भी backgroundTimeRemaining कम हो रही रखता है:

- (void)locationManager:(CLLocationManager *)manager 
didUpdateToLocation:(CLLocation *)newLocation 
     fromLocation:(CLLocation *)oldLocation { 

NSLog(@"Did Update Location = %f/%f", [newLocation coordinate].latitude, [newLocation coordinate].longitude); 

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), ^{ 

    // Do the work associated with the task. 

    [self initTimer]; 

}); 
} 

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { 

[self.locationManager stopUpdatingLocation]; 
UIApplication* app = [UIApplication sharedApplication]; 

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

// Start the long-running task and return immediately. 
[self initTimer]; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    // Do the work associated with the task. 

}); 

} 

मैं भी टाइमर अमान्य कर रहा हूँ:

- (void)checkUpdates:(NSTimer *)timer{ 
UIApplication* app = [UIApplication sharedApplication]; 
double remaining = app.backgroundTimeRemaining; 
if(remaining < 580.0 && remaining > 570.0) { 
    [self.timer invalidate]; 
    self.timer = nil; 
    [self.locationManager startUpdatingLocation]; 
    [self.locationManager stopUpdatingLocation]; 
} 
DbgLog(@"*************************Checking for updates!!!!!!!!!!! Reminaing %f", app.backgroundTimeRemaining); 
} 
+3

क्या आपका ऐप ऐप स्टोर में स्वीकार किया गया है? मैं एक ही दृष्टिकोण लेने पर विचार कर रहा हूं लेकिन मुझे यह सुनिश्चित करने की ज़रूरत है कि मेरा ऐप खारिज नहीं किया जाएगा। धन्यवाद बीटीडब्ल्यू! – aslisabanci

+1

क्या आपको यह काम करने के लिए मिला? –

उत्तर

8

कुछ दिनों के बाद सभी संभावित समाधानों का प्रयास करने के बाद मैं अंततः इसे काम करने में सक्षम था।

  • मैं सेटअप करने के लिए UIBackgroundTaskIdentifiers, टाइमर के लिए, और locationManager

मेरी समाधान पर के लिए एक और एक की जरूरत है, बस जोड़ें:: यहाँ क्या मेरी समाधान में गलत था है

UIApplication *app = [UIApplication sharedApplication]; 

bgTask2 = [app beginBackgroundTaskWithExpirationHandler:^{ 
[app endBackgroundTask:bgTask2]; 
bgTask2 = UIBackgroundTaskInvalid; }]; 

self.locationManager.delegate = self; 
[self.locationManager startUpdatingLocation]; 
+27

आप किस लाइन को जोड़ रहे हैं? – Michal

+0

@scurioni क्या आप अपना पूरा कामकाजी कोड पोस्ट कर सकते हैं? – Sharme

+0

क्या आप कृपया ऐप प्रतिनिधि के कामकाजी कोड साझा कर सकते हैं ?? हम एक ही मुद्दे का सामना कर रहे हैं। –

4

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

+1

और उन सेवाओं में अभी तक एक समय आधारित संस्करण नहीं है, बल्कि, प्रत्येक अपडेट के साथ ट्रिगर किया गया है, या महत्वपूर्ण स्थान परिवर्तन –

+0

पर पोस्ट किया गया है लेकिन मैंने जो पोस्ट जोड़ा है, उसे लगता है, ऐसा लगता है कि लोग ऐसा करने में सक्षम थे। आपको क्या लगता है कि मैंने जो कार्यान्वित किया है उससे अंतर और कोड उन्होंने किया है? – scurioni

+1

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

9

किसी और को यह पता लगाने की कोशिश कर रहे समय का दुःस्वप्न होने के लिए, मेरे पास एक आसान समाधान है।

  1. raywenderlich.com से उदाहरण का अध्ययन करें। नमूना कोड पूरी तरह से काम करता है, लेकिन दुर्भाग्य से पृष्ठभूमि स्थान के दौरान कोई टाइमर नहीं है। यह अनिश्चित काल तक चलेगा।
  2. इस कोड स्निपेट का उपयोग करके टाइमर जोड़ें:

    -(void)applicationDidEnterBackground { 
        [self.locationManager stopUpdatingLocation]; 
    
        UIApplication* app = [UIApplication sharedApplication]; 
    
        bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
        [app endBackgroundTask:bgTask]; 
        bgTask = UIBackgroundTaskInvalid; 
        }]; 
    
        self.timer = [NSTimer scheduledTimerWithTimeInterval:intervalBackgroundUpdate 
                   target:self.locationManager 
                   selector:@selector(startUpdatingLocation) 
                   userInfo:nil 
                   repeats:YES]; 
    } 
    
  3. बस Info.plist में जोड़ने के लिए "अनुप्रयोग स्थान अपडेट के लिए पंजीकृत करता है" मत भूलना।

+3

'bgTask' कहां से आता है? – KKendall

+2

संपत्ति (nonatomic) UIBackgroundTaskIdentifier bgTask; हेडर क्लास – HelmiB

+2

@ हेल्मीबी: यह ** आईओएस 7 ** में काम नहीं कर रहा है, क्या आप कुछ और सुझाव दे सकते हैं, मुझे पृष्ठभूमि में स्थान प्रबंधक शुरू करना होगा। – Optimistic

0

कार्य संहिता (संपूर्ण चरणबद्ध कोड) संशोधित scurioni के कोड

चरण 1

  • जाओ परियोजना के लिए -> क्षमताओं -> पृष्ठभूमि मोड -> स्थान का चयन करें अद्यतन।
  • प्रोजेक्ट पर जाएं -> जानकारी -> एक वैकल्पिक स्ट्रिंग के साथ एक प्रमुख NSLocationAlwaysUsageDescription जोड़ें।

चरण 2

AppDelegate.m लिए इस कोड को जोड़े

@interface AppDelegate()<CLLocationManagerDelegate> 
@property (strong, nonatomic) CLLocationManager *locationManager; 
@property (strong, nonatomic) NSTimer *timer; 
@end 

चरण 3 जोड़े इस कोड में में विधि applicationDidEnterBackground AppDelegate.m

- (void)applicationDidEnterBackground:(UIApplication *)application { 
     UIApplication *app = [UIApplication sharedApplication]; 
     __block UIBackgroundTaskIdentifier bgTaskId = 
     [app beginBackgroundTaskWithExpirationHandler:^{ 
      [app endBackgroundTask:bgTaskId]; 
      bgTaskId = UIBackgroundTaskInvalid; 
     }]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      self.timer = nil; 
      [self initTimer]; 
      [app endBackgroundTask:bgTaskId]; 
      bgTaskId = UIBackgroundTaskInvalid; 
     }); 
    } 

- (void)initTimer { 
    if (nil == self.locationManager) 
     self.locationManager = [[CLLocationManager alloc] init]; 

    self.locationManager.delegate = self; 
    [self.locationManager requestAlwaysAuthorization]; 
    [self.locationManager startMonitoringSignificantLocationChanges]; 
    if (self.timer == nil) { 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:0.3 
                 target:self 
                selector:@selector(checkUpdates:) 
                userInfo:nil 
                repeats:YES]; 
    } 
} 

- (void)checkUpdates:(NSTimer *)timer{ 
    UIApplication *app = [UIApplication sharedApplication]; 
    double remaining = app.backgroundTimeRemaining; 
    if(remaining < 580.0) { 
     [self.locationManager startUpdatingLocation]; 
     [self.locationManager stopUpdatingLocation]; 
     [self.locationManager startMonitoringSignificantLocationChanges]; 
    } 
} 

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation { 
    NSLog(@"Did Update Location = %f/%f", [newLocation coordinate].latitude, [newLocation coordinate].longitude); 
    [self updateLocationWithLatitude:[newLocation coordinate].latitude andLongitude:[newLocation coordinate].longitude]; 
    UIApplication* app = [UIApplication sharedApplication]; 
    __block UIBackgroundTaskIdentifier bgTask = 
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [self initTimer]; 
    }); 
} 

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { 
    [self.locationManager stopUpdatingLocation]; 
    UIApplication *app = [UIApplication sharedApplication]; 
    __block UIBackgroundTaskIdentifier bgTask = 
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     [app endBackgroundTask:bgTask]; 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 
    [self initTimer]; 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     // Do the work associated with the task 
    }); 
} 

-(void)updateLocationWithLatitude:(CLLocationDegrees)latitude 
        andLongitude:(CLLocationDegrees)longitude{ 
//Here you can update your web service or back end with new latitude and longitude 
} 
संबंधित मुद्दे

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