2013-04-02 107 views
2

我的應用需要在後臺使用位置服務。所以我說根據apple's文件下面的方法無法在後臺獲取位置更改通知

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

    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer; 

    // Set a movement threshold for new events. 
    locationManager.distanceFilter = 500; 

    [locationManager startUpdatingLocation]; 
} 

,它說,當有關於位置變化的應用程序將得到通知,即- (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation的委託方法將被調用。

中序作出一些後臺處理(程度的處理時間)我已經在上述指定的委託方法內加入ExpirationHandler如下

- (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    UIApplication *app = [UIApplication sharedApplication]; 
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
     bgTask = UIBackgroundTaskInvalid; 
    }]; 

    longitude = newLocation.coordinate.longitude; 
    latitude = newLocation.coordinate.latitude; 

    //Making webservice 
    [self updateServerWithLongitude:longitude andLatitude:latitude]; 
} 

並完成Web服務請求後,我已經停止後臺任務如下

[[UIApplication sharedApplication] endBackgroundTask:bgTask]; 
bgTask = UIBackgroundTaskInvalid; 

預期每一件事情就可以了(能得到位置變更通知)如果我沒有完成Web服務請求後停止後臺任務。但如果我已完成請求後停止後臺任務,我無法獲取位置更改通知和狀態欄中的位置服務圖標消失,而應用程序在後臺.....

我已經搜索了很多修復問題......這是正確的方式來獲取位置更改,並在後臺更新服務器的變化?如果不是,任何人都可以提出一個更好的方法來做到這一點任何幫助是極大的讚賞.....

回答

1

如果您希望在應用程序是在後臺進行的位置變化的更新,蘋果要求你(在這種情況下位置)指定應用程序的背景模式在info.plist中。

他們鍵,您需要使用是UIBackgroundModes

+0

感謝您的善意回覆,但沒有關於蘋果的關於「位置感知編程指南」文檔中啓用「UIBackgroundModes」點。我的應用程序被拒絕是因爲在plist中啓用'UIBackgroundModes'....任何想法? –

+1

如果您需要應用程序在後臺獲取位置更改(並以某種方式處理或使用它),則需要啓用背景模式。蘋果拒絕帶有後臺模式的應用程序,只是把它放在那裏(爲了確保應用程序繼續在bkg中運行),但不要真的使用該模式。 – lostInTransit

+0

我正在更新位置到數據庫在locationManager:didUpdateToLocation:fromLOcation方法,它工作正常,如預期的..有什麼其他事情要實施? –