私のアプリケーションは、バックグラウンドでユーザーの場所の変化を追跡する必要があり、ユーザーが動き回る限り正常に動作します。ユーザーが停止し、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ファイルで次のように宣言されています。
そして、私の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];
AppleフォーラムでpausesLocationUpdatesAutomatically
を検索すると、Apple)からの回答があった同様の行に沿って最近の質問が見つかります。開発者。プライベートフォーラムなので、ここに直接再投稿することはしませんが、要点は、場所の一時停止は、ユーザーが場所を取得したことを忘れた場合の場合です。アプリの実行を認識し、使用を停止しました。アップデートを一時停止しても、バッテリーがすぐに消耗することはありません。残念ながら、新しい動きがアクティビティを再開しているのか、何か他のことをしているのかを知ることはできないため、アップデートはアプリまで再開されません。フォアグラウンドに戻ります。彼らの提案は、一時停止の呼び出しをキャッチし、ユーザーの注意を引いて、まだ更新が必要な場合にアプリを開かせることです。
編集:
pausesLocationUpdatesAutomatically に関するApple独自のドキュメントから。彼らは提案します:
一時停止が発生した後、位置情報サービスが必要であると判断した場合、位置情報サービスを再開するのはあなたの責任です。 Core Locationは、ロケーションマネージャのデリゲートの
locationManagerDidPauseLocationUpdates(_:)
メソッドを呼び出して、一時停止が発生したことを通知します。その方法では、トリガーのタイプがUNLocationNotificationTrigger
であり、ユーザーが現在のリージョンを終了したときに通知するように設定されているローカル通知を構成できます。ローカル通知のメッセージは、更新を再開できるように、ユーザーにアプリを再度起動するように促す必要があります。
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に設定することをお勧めします。
可能であれば、startMonitoringSignificantLocationChangesを使用してください。
このサービスを開始し、その後アプリケーションが終了した場合、新しいイベントが到着すると、システムは自動的にアプリケーションをバックグラウンドで再起動します。
アプリが起動したら(たとえば、ユーザーがアプリを再入力した場合)、これをよりきめ細かい追跡と組み合わせることができます。