2012-05-22 84 views
4

我目前正在編寫一個應用程序,它依賴於位置跟蹤並向服務器發送有關位置的數據。但問題是,它必須全天候運行,目前我每2-3天發生一次隨機崩潰。我所做的讓應用程序在後臺運行不斷,我將一個NSTimer放在beginBackgroundTaskWithExpirationHandler方法的右邊,就是applicationDidEnterBackground方法。計時器執行每分鐘並停止/啓動位置服務。基於位置跟蹤的iOS全職後臺服務

Here is a sample crash log

代碼基本上看起來像這樣:

UIApplication *app = [UIApplication sharedApplication]; 
__block UIBackgroundTaskIdentifier bgTaskId = 0; 

bgTaskId = [app beginBackgroundTaskWithExpirationHandler:^{ 
    NSTimer *t = [NSTimer scheduledTimerWithTimeInterval: 1 * 60.0 target: self selector: @selector(onTick) userInfo: nil repeats: YES]; 
    [t fire]; 

    if (bgTaskId != UIBackgroundTaskInvalid){ 
     [app endBackgroundTask: bgTaskId]; 

     bgTaskId = UIBackgroundTaskInvalid; 
    } 
}]; 

我使用GCDAsyncSockets用於連接的目的,每個呼叫具有約30秒的超時時間。

我真的沒有想法,什麼可能是崩潰發生的原因?

+1

https://developer.apple.com/library/IOs/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide /ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html 此鏈接是多任務和背景資料的文檔。它可能持有我們都在尋求的信息。 – Kaili

+1

是的,我做了這個應用程序一次,你可能想要使用NSRunLoopCommonModes你的計時器 –

+1

你看過WWCD 2010會議「在iOS 4中使用核心位置」和相關的示例應用程序「Breadcrumbs」? http://developer.apple.com/videos/wwdc/2010/他們描述瞭如何在不使用任何計時器技巧的情況下使用核心位置。 – Jenn

回答

4

你的計時器可能發射了AFTER任務無效([UIApplication sharedApplication].backgroundTimeRemaining後到達0

的事情是,你不能使應用程序運行不斷在後臺。如果你想每隔一段時間執行一次代碼,你唯一的選擇就是使用後臺定位API,設置你的應用在其plist中使用位置背景模式。 你將得到CLLocationManagerDelegate回調,並且你有一段時間做一些w當這些方法被調用時。

見關於後臺模式的蘋果的文檔:http://developer.apple.com/library/ios/#DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagingYourApplicationsFlow/ManagingYourApplicationsFlow.html

並且位置awarness手冊:http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/LocationAwarenessPG/Introduction/Introduction.html#//apple_ref/doc/uid/TP40009497