我需要在應用程序轉到後臺時繼續獲取用戶的位置更新,並且正如我在Apple的文檔中發現的那樣,這是允許執行的長時間運行的後臺任務之一。我還需要進行一些處理和網絡調用,以便在通知位置更新時向服務器發送一些信息。我正在試圖做的,在廣招,是這樣的:瞭解iOS中用戶位置的後臺跟蹤
- (void)applicationDidEnterBackground:(UIApplication *)application
{
bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Background task
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"Background time remaining: %f seconds (%d mins)",
[[UIApplication sharedApplication] backgroundTimeRemaining],
(int)([[UIApplication sharedApplication] backgroundTimeRemaining]/60));
// Need to get data from database here
// Finished
if (bgTask != UIBackgroundTaskInvalid) {
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
});
// Start location manager
locationManager = [[CLLocationManager alloc] init];
if ([CLLocationManager locationServicesEnabled]) {
locationManager.delegate = self;
locationManager.distanceFilter = 20;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];
}
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Want to perform some data processing here, including concurrent tasks
// and several network calls to get and send data to server
[self locationProcessingCompleted];
});
}
- (void)locationProcessingCompleted
{
// Check results. If needed, some more data processing and several network
// calls to send data to server
// Close background task
if (bgTask != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
}
我不`噸找到關於位置的服務的長期運行的後臺任務的任何代碼示例,我有一些關於它的幾個問題:
一)是否有必要到dispatch_async
隊列中執行所有的後臺代碼?換句話說,applicationDidEnterBackground:
中的所有代碼都是異步執行的,包括位置管理器設置?
b)[[UIApplication sharedApplication] backgroundTimeRemaining]
正在返回非常長的值。這次不應該在10分鐘左右?
c)我想要做的是:執行初始有限長任務,開始位置更新,然後每次觸發didUpdateToLocation:
時執行一些其他有限長度的任務。我在Info.plist
中設置了location
的值UIBackgroundModes
。我的方法是否正確?我是否會無限期地更新位置,然後在每次更新時,我可以執行長度不超過10分鐘的有限長度任務嗎?
請幫我解決這個問題。在此先感謝
+1這是一個解決方案在iOS 6! – 2013-08-21 12:53:20
這並沒有解決原來的海報問題。設置UIBackgroundModes可以獲得更新,但它不會讓您有足夠的處理時間來實際建立網絡連接並進行實際工作。即使您在位置處理方法中創建了後臺任務,backgroundTimeRemaining仍然是一個巨大的數字,表明它尚未設置。我的經驗是我的後臺操作在幾秒鐘內就被殺死了。 – 2013-10-01 23:18:45
對不起,我不同意,我的一個應用程序在App Store上運行,它在後臺位置更新(網絡訪問,數據操作和發送本地通知等)的基礎上做了很多事情。我猜(可能是錯誤的)你的評論是基於假設/知識而不是這種特殊情況的經驗,或者如果在類似情況下進行處理時遇到問題,你可能做錯了什麼。 – Zee 2013-10-02 12:39:02