最新のiOSデバイスのM7チップを使用すると、CMMotionActivityManagerを使用して、ユーザーが静止状態からランニング、ウォーキングなどに移行するときにプログラムで通知を受けることができます。 StavaとRunkeeperは両方ともこれを使用して、M7を介してユーザーが移動していないことを検出したときに auto-pause GPS polling (GPSアンテナをシャットオフします)再び動いた。これは、アプリがバックグラウンド状態にあるときに実行できます。これがここで重要です。
この機能を複製するときに遭遇する問題は、アプリがバックグラウンドにあるときにGPS更新をオフにすると、アクティビティの更新の受信を停止し、ユーザーがM7を介して再びGPSをオンに戻すことを検出できなくなることです。
GPSを常時実行したままにしておくと、アプリがバックグラウンドにある間ずっと、Core Motionから動きの更新を取得し続けます。
私は、彼らが活動を続けるためにホワイトノイズや他の安価なトリックをプレイしていないと仮定しています。彼らはどうやってこれを行ったのですか?
RunKeeperは実際に目覚めているためにオーディオトリックを使用します。アプリパッケージを開き、Info.plistを確認すると、バックグラウンドオーディオモードに登録されていることがわかります。これにより、距離、速度、ペースの定期的な音声通知が行われます。バッテリーの消耗を最小限に抑えながら、ランニング中に目を覚まし続ける方法でもあります。
RunKeeperの使用中にロケーションサービスアイコン(ステータスバーの三角形)が完全に消えていることに気付いた場合、バックグラウンド実行を実行するためにロケーショントラッキングを使用していません。ジオフェンスをアクティブ化し、重要な場所の変更を監視しても、位置情報サービスのアイコンが表示されます。
また、M7を使用して目を覚ましているわけでもありません。 M7関連のCoreMotion APIからの更新は、アプリをスリープから復帰させません。アプリが起動すると、モーションアクティビティとステップの履歴を照会し、何かを計算しようとすることができますが、それがすべて正確であるとは思いません。
最後に、iPhone 5sおよびM7チップのリリース前にiOS 6で自動一時停止APIが導入されたことに注意する必要があります。それらは直交する概念です。
GPSをオフにすると、アプリはiOS 7のバックグラウンドでコードを実行しません。アプリは非アクティブ状態のように見えます。バックグラウンドに移行するときは、startMonitoringSignificantLocationChanges
を使用し、ロケーションマネージャーから更新を取得することをお勧めします。ユーザー状態の変更時にstartUpdatingLocation
サービスとバックグラウンドでstartMonitoringSignificantLocationChanges
サービスの両方を同時に使用することを意味します。
したがって、ユーザーがGPSをオンにすると、startMonitoringSignificantLocationChanges
を使用している間、アプリは
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
CoreMotion Frameworkのどこが悪いのか、バックグラウンドでここで確認してください。そして、再起動してみてください。 M7チップデバイスがないため、このような場合に加速度計の読み取り値を読み取ることができます。
あなたは実験を検討しましたか
application:performFetchWithCompletionHandler:
アプリデリゲートで?呼び出しの頻度を制御することはできませんが、アプリによっては15分ごとに呼び出される場合があります。その後、そこからCMMotionActivityManagerを起動して、M7の結果を照会できます。
どの機能を複製しようとしているかは完全には明らかではありませんが、M7チップは、アプリが実行されているかどうかに関係なく、すべてのアクティビティを記録します。したがって、単にバックグラウンドでクエリを実行し、ステップの合計またはアクティビティタイプの合計を更新できます。