2013-01-04 144 views
4

我有一個應用程序,它使用CLLocationManager跟蹤用戶的路線,沿着所採取的路徑繪製點。應用程序使用所需的背景模式>應用程序寄存器進行位置更新,並在後臺運行CLLocationManager有時停止更新,而應用程序在後臺

據我所知,後臺發生的任何事情都需要從locationManager:didUpdateToLocation:fromLocation調用,因爲這是每次更新位置時調用的方法。

我遇到的問題是,有時這停止調用。當用戶的位置在15分鐘左右的空間內變化不大時,似乎會發生這種情況。據我所知,調用locationManager:didUpdateToLocation:fromLocation只是停止,大概是爲了節省電池。不幸的是,當你回來時它不會再恢復。

我認爲有沒有辦法來覆蓋這種行爲,所以我想使用通知中心通知用戶該應用程序不再記錄路線。問題是,應用程序如何知道這件事發生了?如果locationManager:didUpdateToLocation:fromLocation未被調用,我無法激發我的通知。如果它被調用,通知不應該觸發。

是否有某種系統通知說位置更新會停止?

我發現很難調試這個,因爲當我外出時我無法將我的Mac帶到設備上的測試位置(在模擬器中只有很多東西可以做)。任何調試技巧也將非常感謝!

+0

iOS系統版本,你測試該反對? – Lefteris

+0

該應用程序支持iOS 5.1及以上版本。我的設備正在運行iOS 6,所以當我外出時,正在使用什麼。 – beev

+0

有趣,但這可能是一個iOS錯誤。您應該對使用導航的應用程序進行測試,並查看是否出現相同的問題。你確定你沒有在任何地方停止位置更新嗎? – Lefteris

回答

0

有位置更新確實失敗

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

有幾種錯誤的委託:kCLErrorDeniedkCLErrorNetwork此處添加代碼以處理它們的委託方法上面沒有更新的位置,也許是UIAlertView告訴用戶。

就我個人而言,我會在出現任何錯誤時致電[locationManager stopUpdatingLocation];,然後根據錯誤原因重新啓動並顯示錯誤消息。

也重新背景,在你的appDelegate校驗碼:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
    [self saveContext]; 
    if ([CLLocationManager significantLocationChangeMonitoringAvailable]) { 
     // Stop normal location updates and start significant location change updates for battery efficiency. 
     [self.locationHandler.locationManager stopUpdatingLocation]; 
     [self.locationHandler.locationManager startMonitoringSignificantLocationChanges]; 
    } 
    else { 
     NSLog(@"Significant location change monitoring is not available."); 
    } 
} 

最後回覆:測試。您可以通過更改模擬器中的位置移動來模擬位置中的一些錯誤。例如,從跑步到駕駛將導致錯誤。從運行到單個特定的自定義位置將導致錯誤。它們都應該出現在上面的locationManager的委託方法中。

+0

感謝您的回答。我將進一步探索locationManager:didFailWithError,看看我是否可以完成這項工作。 – beev

+0

加入[self.locationManager stopUpdatingLocation]; [self.locationManager startUpdatingLocation];到locationManager:didFailWithError:我可以用你描述的方式模擬一個錯誤,但它不會重現錯誤。爲了重現該錯誤,我必須在我的設備上運行應用程序,去某個地方,在同一個地方停留一段時間,然後再去其他地方。今天,我在同一個地方呆了一段時間後,停止錄製路線,但是當我打開應用程序時再次開始錄製。仍在努力弄清楚我可以如何保持它或者通知用戶記錄已停止。 – beev

+0

考慮將代碼添加到appDelegate中的「WillResignActive」中。類似於上面「DidEnterBackground」中的內容。也許加入你的開始,並停止在這裏? – Eric

0

我已經設法通過添加一個本地通知來解決問題,每次將新位置添加到路由時,通知會以90秒的延遲觸發。當添加下一個位置時,先前的通知被取消,並且計劃新的通知。這樣,如果停止更新,用戶會收到通知(儘管延遲時間爲90秒)。這並不理想,對於電池壽命來說可能不是很好,但它是一種解決方案,而且這是目前我所擁有的最好的產品。

+1

您可以在這裏發佈您的代碼作爲答案。我遇到了同樣的問題 –

7

如果你還沒有找到答案,我認爲這是因爲一個新的屬性添加到CLLocationManager稱爲pausesLocationUpdatesAutomatically。該屬性默認爲YES,其行爲與您所描述的完全相同。嘗試將其設置爲NO,我認爲它會解決您的問題。

0

@Ron,我遇到了與beev描述的相同的問題,並且我已經將pausesLocationUpdatesAutomatically設置爲NO。我認爲,因爲iOS會殺死一些在10分鐘內沒有觸發的應用程序。所以現在添加本地通知可能是一個不錯的選擇。

2

在iOS9開始,請確保您還你的位置經理設置此屬性:

[locationManager setAllowsBackgroundLocationUpdates:YES]

相關問題