web-dev-qa-db-ja.com

バックグラウンドのiPhoneGPSが一時停止後に再開することはありません

私のアプリケーションは、バックグラウンドでユーザーの場所の変化を追跡する必要があり、ユーザーが動き回る限り正常に動作します。ユーザーが停止し、CLLocationManagerが10〜20分ほど後に一時停止したとき。これは、この通知によって示されます。

-(void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager{}

そして、これも私にとっては問題ありません。いいですね、バッテリーなどを節約できます。

問題は、ユーザーが再び移動を開始して次のようになったときにCLLocationManagerがウェイクアップしないことですアプリケーションをフォアグラウンドに置くまでデリゲートメソッドが起動されることはありません(アクティブになります):

//Never called back after CLLocationManager pauses:
-(void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager{}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{}

デバイスが再び動き始めた後にlocationManagerDidResumeLocationUpdatesが呼び出されないのはなぜですか?GPSも自動的に再開するべきではありません(自動的に一時停止されたため)?ユーザーの操作なしでGPSを再開する方法はありますか?

アプリケーションは、Info.plistファイルで次のように宣言されています。

enter image description here

そして、私のCLLocationManager設定は次のとおりです。

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[locationManager setActivityType:CLActivityTypeFitness];
//I WANT pauses to save some battery, etc... That is why following line is commented out (default)
 //[locationManager setPausesLocationUpdatesAutomatically:NO];
 locationManager.distanceFilter = kCLLocationAccuracyNearestTenMeters;
 locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
 [locationManager startUpdatingLocation];
29
Lukasz

AppleフォーラムでpausesLocationUpdatesAutomaticallyを検索すると、Apple)からの回答があった同様の行に沿って最近の質問が見つかります。開発者。プライベートフォーラムなので、ここに直接再投稿することはしませんが、要点は、場所の一時停止は、ユーザーが場所を取得したことを忘れた場合の場合です。アプリの実行を認識し、使用を停止しました。アップデートを一時停止しても、バッテリーがすぐに消耗することはありません。残念ながら、新しい動きがアクティビティを再開しているのか、何か他のことをしているのかを知ることはできないため、アップデートはアプリまで再開されません。フォアグラウンドに戻ります。彼らの提案は、一時停止の呼び出しをキャッチし、ユーザーの注意を引いて、まだ更新が必要な場合にアプリを開かせることです。

編集:

pausesLocationUpdatesAutomatically に関するApple独自のドキュメントから。彼らは提案します:

一時停止が発生した後、位置情報サービスが必要であると判断した場合、位置情報サービスを再開するのはあなたの責任です。 Core Locationは、ロケーションマネージャのデリゲートの locationManagerDidPauseLocationUpdates(_:) メソッドを呼び出して、一時停止が発生したことを通知します。その方法では、トリガーのタイプが UNLocationNotificationTrigger であり、ユーザーが現在のリージョンを終了したときに通知するように設定されているローカル通知を構成できます。ローカル通知のメッセージは、更新を再開できるように、ユーザーにアプリを再度起動するように促す必要があります。

30
Lewis Gordon

Apple docは、そのトピックに関して非常に弱いです。プロパティpausesLocationUpdatesAutomaticallyは、ユーザーがGPSを必要としないとAppleが判断した場合に、AppleがGPSをシャットダウンできるようにします。

文書化されていませんが、このプロパティを設定すると、バックグラウンドモードでGPSが停止するようです。

さまざまな投稿で、そのプロパティの問題について説明しています。例:
iOS 6 CoreLocationは機能しません

iOS 6 AutoPauseは機能しません Stanislav DvoychenkoがAppleの推奨事項を投稿しています:

[更新-2013年3月4日]。私はiOS6での場所の変更についてAppleのプレゼンテーションを調べましたが、地域の変更イベントを取得したら、地域の変更の監視を使用して「一時停止を解除」することを提案しています。これは私のシナリオには適していませんが、そのようなイベントが発生するまで、ユーザーは1〜2 km移動/実行/運転する可能性があるため、.

そのプロパティをfalseに設定することをお勧めします。

3
AlexWien

可能であれば、startMonitoringSignificantLocationChangesを使用してください。

このサービスを開始し、その後アプリケーションが終了した場合、新しいイベントが到着すると、システムは自動的にアプリケーションをバックグラウンドで再起動します。

アプリが起動したら(たとえば、ユーザーがアプリを再入力した場合)、これをよりきめ細かい追跡と組み合わせることができます。

1
Terminus