2016-03-30 10 views
0

を消費し、私はそれが原因ロケーションサービスにあまりにも多くのバッテリーを消費しています実現しました。アプリケーションは、私が欲しかったiOSアプリを作成した後、あまりにも多くのバッテリー

背景:私のアプリは、ネットワーク上のサーバへの呼び出しユーザーは10メートル(30フィート)を移動するたびになります。これにより、didUpdateLocation機能がトリガされます。この関数がトリガされると、私はNSURLSessionを使ってユーザー座標をサーバーに送信します。それは実際にはそれです。

ここでは、ユーザーが再度移動することを決定したときに後続の更新を取得しないため、最初の更新後にlocationManager.stopUpdatingLocation()を呼び出して位置サービスハードウェアの電源を切ることができないという問題があります。さらに、アプリケーションがバックグラウンドにある間は、位置情報サービスがアクティブのままで動きを監視し、バッテリ寿命を引き締めます。この問題については、ここではドキュメントやその他の質問についてほとんどすべてを読んだことがあります。

他の質問の多くはNSTimerを使用して、時間の間隔が通過したと私は私のdidUpdateLocation機能でstopUpdatingLocationを最初の位置更新を受信し、呼び出した後startUpdatingLocation()を呼び出すことをお勧めします。だから私は次のように試した:

let timerAction = NSTimer(timeInterval: 6.0, target: self, selector: #selector(MapViewController().startLocationServices), userInfo: nil, repeats: true) 
    timerAction.fire() 

func startLocationServices() { 
    self.locationManager.startUpdatingLocation() 
} 

これは何らかの理由でうまくいかなかった。しかし、私の質問は実際にdistanceFilter = 10.0でフォアグラウンドとバックグラウンドでユーザーの動きを監視する必要があるときにバッテリーを節約し、アプリを本当にエネルギー効率にする方法に焦点を当てていますか?

任意の提案多分途方もなく追求していただければ幸いです何を行ったか、何を推薦する周り。

ありがとうございました!

編集

@wainは、このメソッドを呼び出す前に、スタートに

allowDeferredLocationUpdatesUntilTraveled:timeout:位置更新の配信を使用して提案しました。このメソッドを呼び出す最も一般的な場所は、デリゲートのlocationManager:didUpdateLocations:メソッドです。新しい場所を処理した後、距離または時間基準が満たされるまで、将来の更新を延期する場合は、このメソッドを呼び出します。新しいイベントが到着してアプリがバックグラウンドにある場合、イベントはキャッシュされ、配信は適切に延期されます。

  1. 使用allowDeferredLocationUpdatesUntilTraveled:timeout:
  2. 使用重大なロケーション変更

は、デバイス上で使用できない場合、あなたの10メートルを犠牲にしなければならない、最初に試してみてください:あなたは2つのオプションを持っている

+0

(少なくとも、さまざまなデバイス機能に)起こることはありません。なぜ10m毎日24/7が必要ですか?誰がこのアプリの使用に興味を持っていますか?あなたの研究が唯一のものだったのはNATimerですか? – Wain

+0

あなたは、1日中どこに行ったのかをピンから落とします。それはあなたの階段のものをリトレースするようなものです。それはちょうど楽しみのためです。私は他のアプリがこれをやっているのを見て、動きやふれあいなどの相対的な方法で効率的にやっています。 – Mihado

答えて

2

は私がジオフェンシングを使用することによって、この問題を改善終わりました。 CLCircularRegionを作成し、startMonitoringForRegion(_:)に電話します。ユーザーが地域(10メートル)を離れるたびに、私はサーバーに現在どこにいるのかを確認し、地域を更新するように要求します。これはバッテリーをほとんど使用しないで、まさに私が探しているものです。これを行う方法についてはCLLocationManager,CLLocationManagerDelegateCLCircularRegionのクラスを見てください。これが誰かのために便利になることを願っています。

2

目標

+0

'allowDeferredLocationUpdatesUntilTraveled:timeout'私はこれを詳しく見ました。私は 'viewDidLoad'からそれを呼びますか?それは私が現在 'startUpdatingLocation()'を呼び出している場所です。 – Mihado

+0

ロケーショントラッキングを開始する前に設定し、アップデートの委任に注意してください – Wain

関連する問題