2013-05-31 75 views
1

我們iOS應用程序的一個需求是監視後臺中的位置更改。我們已經實現了「locationManager startMonitoringForRegion:region」,不幸的是,我們在徹底測試應用程序時意識到它不足以滿足我們的需求。iOS應用程序在後臺時如何確保位置的不斷更新?

然後我們使用「locationManager startUpdatingLocation」來提高位置的準確性。在前景中,一切都非常好,這個位置精度幾乎是我們想要的。

現在的問題是,當應用程序在後臺,事件「didUpdateLocations」不定期調用。我們通過查看日誌文件來觀察這一點。會發生什麼幾乎總是相同的,前15分鐘的應用程序定期更新位置,然後突然突然停止。大約5分鐘的休息之後,它繼續更新地點約15分鐘。而且這種情況也是如此。

我們可能在執行後臺處理時犯了錯誤。

UIApplication *app = [UIApplication sharedApplication]; 
UIBackgroundTaskIdentifier bgTask = 0; 

bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 

    if(rootViewController._selectedLocation == nil) 
    { 
     NSLog(@"selected location is nil and app entered background"); 
     [rootViewController.locationManager stopUpdatingLocation]; 
    } 
    else 
    { 
     NSLog(@"selected location is not nil and app entered background"); 
     [rootViewController.locationManager startUpdatingLocation]; 
    } 
    [app endBackgroundTask:bgTask]; 

}]; 

這似乎被稱爲每20分鐘一次,並且位置被再次更新。我們做錯了什麼?我們如何才能在不中斷的情況下定期更新位置信息?我們用iPhone 5測試了這一點,而且知道它是固定的也很重要。

+0

你有沒有在後臺調用stopUpdatingLocation?順便說一句,我相信你不需要使用'beginBackgroundTaskWithExpirationHandler:'如果你的plist中有'location'鍵。 – progrmr

+1

另外,你在[CLLocationManager](https://developer.apple.com/library/ios/#documentation/CoreLocation/Reference/CLLocationManager_Class/CLLocationManager/CLLocationManager.html)上設置了activityType屬性?您是否已將'pausesLocationUpdatesAutomatically'設置爲NO? – progrmr

+0

非常感謝,你剛剛解決了它。我將CllocationManager的pausesLocationUpdatesAutomatically設置爲否。該應用程序現在在後臺定期更新位置。是的,它看起來像beginBackgroundTaskWithExpirationHandler:沒有必要。再次感謝! – BCI

回答

0

你應該添加到您的應用程序plist文件以下值:

所需的背景模式

它是一個數組系統知道你的應用程序需要在後臺時。在項0的位置,你應該告知值:

應用程序註冊了位置更新

在有疑問的情況下,你可以在這個鏈接看看我說的:iOS Multitasking: Background Location

+0

感謝您的鏈接和建議。 「所需的背景模式」下的值爲「位置更新的應用程序註冊」已添加到plist。這似乎不是問題,這個錯誤在別的地方。我會仔細看看鏈接,你寄給我的。 – BCI

相關問題