2016-04-15 7 views
2

私は、バックグラウンドでユーザーの場所を取得するために重要な場所の変更を監視するアプリケーションを開発しています。私はlocationManager.startMonitoringSignificantLocationChangeslocationManager:didUpdateLocationslocationManager:didFailWithErrorの方法を私のCLLocationManagerDelegateに実装しました。重要なロケーションの変更を監視するときに、ロケーション更新を延期することはできますか?

しかし、SLCは実際に必要以上に正確です。 Appleの文書によると、私のテストで確かめられたところによると、slcはおよそ500mごとに5〜10分の間に場所の更新を引き起こします。したがって、このガイドで説明されているdidUpdateLocationsメソッドのlocationManager.allowDeferredLocationUpdatesUntilTravelled:timeoutをデリゲートのhttp://apple.co/1W4gqEJに実装しました。

var deferringUpdates = false 

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    for location in locations { 
     NSLog("Significant location change recorded:\n%@", location) 
    } 

    if let location = locations.first { 
     let secondsAgo: NSTimeInterval = location.timestamp.timeIntervalSinceNow 

     // Only process the location if it is very recent (less than 15 seconds old). 
     if abs(secondsAgo) < 15.0 { 
      saveExtendedUserInfo(withLocation: location) 
     } 
    } 

    if !deferringUpdates { 
     manager.allowDeferredLocationUpdatesUntilTraveled(810, timeout: 600) 
     deferringUpdates = true 
     NSLog("Deferring location updates...") 
    } 
} 

func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { 
    NSLog(error.localizedDescription) 
} 

func locationManager(manager: CLLocationManager, 
    didFinishDeferredUpdatesWithError error: NSError?) 
{ 
    deferringUpdates = false 

    if let deferralError = error { 
     NSLog(deferralError.localizedDescription) 
    } 
} 

残念ながら、ロケーションマネージャが更新を延期することはありません:

は、ここに私のコードです。 allowDeferredUpdatesUntilTravelled:timeoutが呼び出された直後に、デリゲートはdidFinishDeferredUpdatesWithErrorを実行し、kCLErrorDomain 12CLError.DeferredNotUpdatingLocation)を生成します。

なぜエラーが表示されますか?これは、遅延アップデートサービスが、重要なロケーションの変化を「ロケーションの更新」として認識しないことを意味しているようです。 slcイベントの配信を延期することも、何らかの形でその頻度を減らすことも可能ですか?もしそうなら、どうですか?

+0

ねえ。私は同じことを実装しています。どうやったの?これで私を助けてくれますか?どのようにこのメソッドを使用するか.allowDeferredUpdatesUntilTravelled:ユーザーの速度に応じてタイムアウトしますか? – BHUMICA

答えて

3

更新を延期する目的は、GPSから1 Hzの位置更新を処理するときにメインCPUが消費するバッテリを節約することです。遅延アップデートでは、GPSチップがGPS位置を1秒間に1回(1Hz)蓄積する間、CPUはスリープ状態のバッテリを保持したままになります。

重要な位置の変更(SLC)システムでは、ではなく、 GPSを使用しています。これは、セルタワーの三角測量に基づいて位置を決定しており、重大な変更が発生するまでCPUを起動させません。

これらの2つの機能は互いに排他的です。GPSチップがSLCに含まれていないため、重要なロケーションチェンジの更新を延期することはできません。

関連する問題