2014-09-26 184 views
2

我開始使用IOS開發,而且我對這門語言非常陌生。IOS-位置更新時間間隔

我試圖開發一個應用程序,將追蹤背景上的設備的位置。我已經遵循了一些教程並提供了一個記錄位置更新的代碼。

-(void)CurrentLocationIdentifier 
{ 
    locationManager = [CLLocationManager new]; 
    locationManager.delegate = self; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [locationManager startUpdatingLocation]; 
} 

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
    fromLocation:(CLLocation *)oldLocation { 

     NSLog(@"%@", newLocation); 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    [self CurrentLocationIdentifier]; 
} 

它的工作原理。由於我已經配置了.plist文件,因此它被註冊爲在後臺運行,它無止境地記錄了位置。

但我需要更新定期,定義的時間間隔,否則它會是一個電池殺手。我意識到有關背景中的位置更新有很多問題,但我的嘗試沒有成功,我被卡住了。

我已經試過回採更新和位置更新偵聽器內安排與的NSTimer開始:

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
    fromLocation:(CLLocation *)oldLocation { 

     NSLog(@"%@", newLocation); 

     [locationManager stopUpdatingLocation]; 
     NSTimer *timer; 
     timer = [NSTimer scheduledTimerWithTimeInterval:10 
        target:self 
        selector:@selector(CurrentLocationIdentifier) 
        userInfo:nil 
        repeats:NO]; 
} 

哪裏CurrentLocationIdentifier是再次請求啓動更新的方法。

但它第一次運行,然後不開啓預定的任務!我究竟做錯了什麼?應該以其他方式完成嗎?

回答

1

在給定的時間間隔後執行代碼無法喚醒應用程序。您確實有兩種選擇,後臺提取以及區域監視或重大位置更改。

在定期獲得位置更新的條款(根據時間而不是距離移動),你能做的最好是使用iOS的多任務處理API performFetchWithCompletionHandler,它概括地說允許OS叫醒你時決定了你可以有時間處理。你將有大約30秒的時間來處理你想要的東西,然後回去睡覺。

https://developer.apple.com/library/ios/documentation/uikit/reference/uiapplicationdelegate_protocol/index.html#//apple_ref/occ/intfm/UIApplicationDelegate/application:performFetchWithCompletionHandler

有許多的參與讓這個設置步驟,但它很容易和應該指向你在正確的方向。請注意,這不會允許您在任何時間安排這些事件,但實際上受操作系統及其用於確定應該允許您執行後臺提取的頻率的算法限制。如果您花費很長時間並使用大量電池,您將不會頻繁取閱,如果您花費太多時間並且從未完成,您將被終止。在後臺進行「負責任」最終會給操作系統帶來更多時間。

根據我的經驗,在進行位置更新和發送服務器請求時儘可能「負責」,後臺提取大約發生。相隔15-30分鐘。

如果你想在用戶移動某個指定的距離時被喚醒,區域監控是一個很好的(儘管不完美)的方式來處理它,並且可以讓你的應用程序醒來,開始長時間運行的後臺任務(30秒),然後在結束任務並重新進入睡眠之前執行您需要執行的操作。

2

如果你不需要在後臺進行詳細的位置更新,那麼significant location update service可能是最好的方法。

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
     ... // Any other initialisation you already have 
    locationManager = [CLLocationManager new]; 
    locationManager.delegate = self; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [locationManager startUpdatingLocation]; 
} 

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    if ([CLLocationManager significantLocationChangeMonitoringAvailable] { 
     [locationManager stopUpdatingLocation]; 
     [locationManager startMonitoringSignificantLocationChanges]; 
    } 
    else { 
     //Decide what you want do to if it isn't available 
    } 
} 

- (void)applicationDidEnterForeground:(UIApplication *)application 
{ 
    [locationManager startUpdatingLocation]; 
    [locationManager stopMonitoringSignificantLocationChanges]; 
} 

順便問一下,你正在使用的委託方法,locationManager:didUpdateToLocation:fromLocation:已被廢棄,你應該使用locationManager:didUpdateLocations:

UPDATE 顯着位置變化並不適用於所有的設備,所以我增加了一個檢查到我的代碼。你需要決定採取什麼樣的方式在設備上它不可用 - 堅持使用標準的更新,也許增加distanceFilter

+0

但是,這不會像監視每一個小小的變化一樣消耗盡可能多的電量嗎? – LcSalazar 2014-09-26 22:04:18

+0

不,重要的位置更新改變使用WiFi和蜂窩塔監視以及GPS來推遲位置更新,直到用戶移動了相當長的距離(通常至少幾百米)。我建議你觀看今年和前幾年的位置服務WWDC視頻和/或閱讀Apple提供的位置服務節目指南。他們討論有效使用位置的最佳實踐。 – Paulw11 2014-09-26 22:06:32

+0

隨着你的計時器方法,你試圖「第二次猜測」的iOS。這種方法可以讓iOS協調整個設備的位置更新,如果另一個應用程序使用詳細的位置,您的應用程序將自動獲得更頻繁的更新。如果沒有,那麼iOS將管理位置更新以提高電池效率 – Paulw11 2014-09-26 22:08:29

2

我在Github上,https://github.com/dsdavids/TTLocationHandler一個項目,你是歡迎下載和擺弄。 TTLocationHandler是您可以設置的類中的一個下拉菜單,因爲您希望獲得其他人指向的那種結果。當我處於你的情況時,我試圖弄清楚如何在後臺使用定位服務。

我強烈建議您忘記任何計劃定時器試圖定期開火的想法。我們的想法是將處理程序設置爲觸發事件,然後分析返回結果,並進一步將響應過濾爲只根據需要進行的活動。我發現重大的位置變化是最好的折衷。

您可以將此設置爲非停止跟蹤,然後只根據需要進行響應。你最好有一個很好的理由,電池命中或你的應用程序將被拒絕。一開始我的應用程序被拒絕,即使我將它設置爲只有在插入電源時才能完成。我想他們是對的。通過重大的位置變化和區域監控,我能夠獲得所需的一切。我的應用永遠不會讓locationManager瘋狂,並且對電池幾乎沒有影響。