web-dev-qa-db-ja.com

CoreLocation重要な場所の監視とCoreBluetoothを使用する場合のバッテリーの消耗

バックグラウンドで実行され、CoreBluetoothCoreLocationを使用して駐車場所を自動的に保存するアプリケーションをリリースしました。

大まかに言えば、アプリはCoreBluetooth切断イベントを探し、位置情報の修正(精度<= 10m)または最大時間3分(地下駐車場に駐車する場合に発生する可能性があります)が得られるまでGPSをオンにします。 GPSカバレッジのないロット)。次に、重要な場所の監視を使用して、システムがアプリを終了した場合にアプリケーションを自動的に再起動します。

開発中、バッテリーの消耗の問題は発生しませんでしたが、ユーザーの75%が、バッテリーの消耗が著しいと答えています。支持者の10%が投票に回答したため、内訳がどの程度代表的であるかを判断するのは困難ですが、ユーザーの大部分を占めています。 http://www.findmycarsmarter.com/forum/viewtopic.php?f=4&t=

次に、ユーザーが重要な場所の監視を無効にできるようにする更新をリリースしました。60%が、重要な場所の監視を無効にすると、ドレインがなくなると述べています。 http://www.findmycarsmarter.com/forum/viewtopic.php?f=4&t=42

当初、排水管の問題を自分で再現することはできませんでしたが、Find My Car Smarterと組み合わせて重要な位置の監視をオンにした単純なアプリをインストールすると、排水管が断続的に再現されることがわかりました。ドレイン状態では、電話機は休止状態になりません。これは、([設定]-> [使用法]-> [最後のフル充電からの時間])の使用時間が、電話機がスリープ状態になっていてディスプレイがオフになっている場合でも増加し続けることで示されます。何かがシステムの休止状態に入るのを妨げています。この段階では、バッテリーは1時間あたり約15%消耗します。このドレインは断続的に現れ、1、2時間後には消えて、ランダムに再び現れるようです。排水管を確実に再現する方法は見つかりませんでした。

この問題は、複数のクライアントがCoreLocationを呼び出していることが原因であると考えられます。問題が発生した数人のユーザーに、スマートフォンをワイプして、Find My CarSmarterアプリのみをインストールするように依頼しました。このアプリだけをインストールしただけでは、ドレインは表示されませんでした。私たちのアプリをGoogleLatitudeやFacebookなどで使用すると、ドレインが発生するのを確認したという報告が他にもあります。または、他のアプリケーションを殺してしまうと、ドレインがなくなります。アプリを起動せずに、電源を入れ直してもドレインが持続することを確認しました。これは、OSがスリープ状態になるのを防ぐシステムレベルのサービスでなければならないことを意味します。

この問題は、CoreLocationを呼び出す複数のクライアントの競合状態が原因であると考えられますが、CoreLocationのみを使用するアプリで問題が再現されることはありませんでした。 CoreLocationに同時にアクセスする4つまたは5つの異なるアプリを作成しましたが、ドレインが発生することはありませんでした。ただし、CoreLocationを備えたアプリとCoreLocation + CoreBluetoothを備えた2番目のアプリがあるときに問題が発生しました。 CoreLocation + CoreBluetoothの組み合わせを使用するアプリはおそらく非常に少ないため、より多くの開発者がこの問題に直面していない可能性があります。 CoreLocationとCoreBluetoothがどのように相互作用してこのドレインを引き起こすのか、そしてCoreLocationを備えた2番目のアプリがどのように方程式に組み込まれるのかを説明するのは途方に暮れています。ドレインが断続的だったため、CoreLocation + CoreBluetoothでテストしたときにのみ問題が発生したのはまぐれである可能性があります。

これら2つのアプリCTM1とFMCのみがインストールされたワイプされた5.0.1iPhone 4Sでは、断続的にドレイン状態に入ることができました。興味深いことに、ドレインの問題は、ワイプされたデバイスでは通常のデバイスよりもはるかに少ない頻度で発生するようでした。残念ながら、ドレイン状態は数回しか見られず、ドレインを確実に再現できなければ、適切な制御状態を使用できません。

Appleでバグレポートを提出し、テクニカルサポートインシデントを開始しましたが、Stackoverコミュニティも洞察を提供できる可能性があります。この問題は5.0.1とで確認されています。 5.1ベータ3。

CTM1 http://www.findmycarsmarter.com/files/CTM1.Zip

On Going into the Background
    [locationManager stopUpdatingLocation];
    [locationManager stopUpdatingHeading];
    [locationManager startMonitoringSignificantLocationChanges];

On Re-entering Foreground
    [locationManager stopMonitoringSignificantLocationChanges];
    [locationManager startUpdatingLocation];
    [locationManager startUpdatingHeading];
On didUpdateToLocation
    //do nothing
On didUpdateHeading
    //do nothing

FMC http://www.findmycarsmarter.com/files/FMC.Zip

On Going into the Background
    [btleManager stopScan];
    [locationManager stopUpdatingLocation];
    [locationManager stopUpdatingHeading];
    [locationManager startMonitoringSignificantLocationChanges];

On Re-entering Foreground
    [locationManager stopMonitoringSignificantLocationChanges];
    [locationManager startUpdatingLocation];
    [locationManager startUpdatingHeading];        
    [btleManager scanForPeripheralsWithServices:nil options:nil];
On didUpdateToLocation
    //do nothing
On didUpdateHeading
    //do nothing
On centralManagerDidUpdateState
    [btleManager scanForPeripheralsWithServices:nil options:nil];
On didDiscoverPeripheral
    [btleManager connectPeripheral:device options:nil];
On didConnectPeripheral
    //update log
On didDisconnectPeripheral
    //initiate reconnect
    [btleManager connectPeripheral:device options:nil];

ドレインの原因となる可能性のあるコーディングミスを見つけた場合は、お知らせください。

GPSと重要な位置監視の両方を使用している場合、私たちが持っていたもう1つの質問は、stopMonitoringSignificantLocationChangesを呼び出す理由がありますか?リージョンのサンプルコードを見ると、フォアグラウンドに入るとstopMonitoringSignificantLocationChangesstartLocationUpdate、バックグラウンドに入るとstopLocationUpdatestartMonitoringSignificantLocationChangesと呼ばれますが、これは必要/推奨/必須?

更新:

Apple Developer Technical Supportで、GPSと重要な位置の監視の両方を使用するアプリケーションについて、GPSの更新を有効にする前に重要な位置の監視をオフにするシーケンスが正しいことを確認しました。

また、GM 5.1&5.1フレームワークに対して再コンパイルされたFind My Car Smarterアプリケーションを使用すると、ドレインの問題が引き続き発生することも確認しました。

更新:

重要な場所の監視イベントに応答してアプリをバックグラウンドから起動すると、問題が発生するようです。サンプルコードでは実際にはこのシナリオを適切に処理していませんが、実際のアプリでは処理しています。

サンプルコードでは、バックグラウンドでの再起動時に位置の更新をオンにします。applicationDidEnterBackground呼び出しがないため、GPSはオンのままになります。

私たちのアプリでは、UIApplicationLaunchOptionsLocationKeyフラグを探してバックグラウンドから起動されたかどうかを確認します。起動された場合は、重要な場所の監視を開始します。そうでない場合は、フォアグラウンドで起動され、場所の更新を開始します。

Appleは私たちに戻ってきて、重要な場所の監視の使用はInfo.plistのUIBackgroundModes配列で設定された場所を必要としないと述べました。このエントリを削除したところ、バッテリーの消耗状態は発生しなくなったようです。 UIBackgroundModesリストにはまだbluetooth-centralがあります。現時点では、これがなぜ役立つのかは不明です。これをよりよく理解するために、さらにいくつかの実験を実行する予定です。誰か提案があれば私達に知らせてください。

38
fmc

結局のところ、UIBackgroundModesから場所を削除するというAppleの提案により、バッテリーの消耗の問題が修正されました。

バックグラウンドで場所を取得するには、[locationManager startLocationUpdates][locationManager stopLocationUpdates]の呼び出しを次のようにラップする必要がありました。

[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler];
[[UIApplication sharedApplication] endBackgroundTask:];
17
fmc

繰り返し信号音を使用して、アプリのステータスをデバッグできます。このテストのバックグラウンドモード要件に「オーディオの再生」を入れていないことを確認してください。アプリが実行されている場合、アプリケーションがバックグラウンドにある場合でも、この音が聞こえます。アプリが一時停止されている場合、何も聞こえません。これは、アプリが適切に一時停止されていないことを検出するためのおそらく最も簡単な方法です。

デバイスがコンピューターに接続されている場合、デバッグモードでは多くのことが異なる動作をするため、この問題のデバッグにプロファイラーを使用すると問題が発生します。特に省電力のもの。

また、場所の大幅な変更に対応するために、すべてが正しく行われていることを確認してください。位置情報の更新を開始する場合は、位置情報の更新をシャットダウンするタイマー(たとえば、3分間)を設定していることを確認してください。とにかく、iOSは、重要な場所の変更への応答から場所の更新を開始した場合でも、アプリを強制終了します。応答で何を開始したかは関係ありません-アプリがまだ実行されている場合は10分で強制終了されます-クラッシュログに注意してください-そのようなイベントはそこに記録されます。

また、すべてのサードパーティのコードとライブラリを確認してください。おそらく、それらのいくつかはGPSをオンにして、何かに使用します。ほとんどが妄想的ですが、分析および広告ターゲティングの目的で発生する可能性があります。

2
AlexeyVMP

CoreLocation対応のアプリケーションは一般にバックグラウンドモード用に作成されているため、バックグラウンドで実行できます。間違いなくバッテリーの使用量が多くなります。私の提案では、必要がない場合は常に位置情報サービスを停止しようとします。

[locationManager stopUpdatingLocation];

その後、要件に応じて開始し、それに応じて、

ありがとう

0