5

CLLocationManagerユーザーのルートを追跡し、たどった経路に沿って点を描くアプリがあります。アプリは、必要なバックグラウンド モードを使用してバックグラウンドで実行されます > アプリは位置情報の更新を登録します。

私が理解しているように、バックグラウンドで発生するものはlocationManager:didUpdateToLocation:fromLocationすべて、位置情報が更新されるたびに呼び出されるメソッドであるため、呼び出す必要があります。

私が抱えている問題は、これが呼び出されなくなることがあるということです。ユーザーの場所が 15 分程度の間隔であまり変化しない場合に発生するようです。私が知る限り、おそらくバッテリーを節約するために、locationManager:didUpdateToLocation:fromLocation への呼び出しが停止します。残念ながら、移動に戻ったときに再び再開することはありません。

この動作をオーバーライドする方法はないと思われるため、通知センターを使用して、アプリがルートを記録していないことをユーザーに通知したいと思います。問題は、これが発生したことをアプリがどのように知ることができるかということです。locationManager:didUpdateToLocation:fromLocation が呼び出されない場合、通知を送信できません。呼び出されている場合、通知は発生しません。

位置情報の更新が停止されるというシステム通知はありますか?

これをデバッグするのは非常に難しいと思います。外出中に Mac をどこにでも持っていくことができず、デバイス上の位置をテストすることができないからです (シミュレーターでできることは限られています)。デバッグのヒントも大歓迎です!

4

5 に答える 5

8

CLLocationManager答えが見つからない場合は、という名前に新しい属性が追加されたためだと思いますpausesLocationUpdatesAutomatically。属性のデフォルトはYESで、その動作は説明どおりです。に設定してみてくださいNO。問題が解決すると思います。

于 2013-02-22T18:41:12.507 に答える
4

iOS9 以降では、ロケーション マネージャーでもこのプロパティを設定していることを確認してください。

[locationManager setallowBackgroundLocationUpdates:YES]

于 2016-04-05T20:36:21.923 に答える
1

失敗した場所の更新のデリゲートがあります

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

エラーにはいくつかの種類があります:kCLErrorDenied kCLErrorNetworkここにコードを追加して、場所を更新しない上記のデリゲート メソッドでエラーを処理します。おそらくUIAlertView、ユーザーに通知するためです。

個人的には、エラーを呼び出し [locationManager stopUpdatingLocation];てから、失敗の理由に応じてエラー メッセージを表示して再起動します。

背景についても、appDelegate のコードを確認してください。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    [self saveContext];
    if ([CLLocationManager significantLocationChangeMonitoringAvailable]) {
        // Stop normal location updates and start significant location change updates for battery efficiency.
        [self.locationHandler.locationManager stopUpdatingLocation];
        [self.locationHandler.locationManager startMonitoringSignificantLocationChanges];
    }
    else {
        NSLog(@"Significant location change monitoring is not available.");
    }
}

最後に再: テスト。シミュレーターで位置の移動を変更することで、位置のエラーをシミュレートできます。たとえば、ランニングからドライブに移行するとエラーが発生します。実行中から単一の特定のカスタム ロケーションに移動すると、エラーが発生します。それらはすべて、上記の locationManager のデリゲート メソッドに表示されるはずです。

于 2013-01-04T15:50:57.080 に答える
0

@Ron、beevの説明と同じ問題に遭遇しました。すでにpausesLocationUpdatesAutomaticallyをNOに設定していました。iOS は、バックグラウンドで 10 分以内にトリガーされなかった一部のアプリを強制終了するためだと思います。そのため、現時点ではローカル通知を追加することをお勧めします。

于 2013-03-27T07:08:03.927 に答える
0

新しい場所がルートに追加されるたびに 90 秒の遅延で起動するローカル通知を追加することで、問題を解決することができました。次の場所が追加されると、以前の通知はキャンセルされ、新しい通知がスケジュールされます。このようにして、更新が停止した場合、ユーザーは通知を受け取ります (ただし、90 秒の遅延があります)。それは理想的ではなく、バッテリーの寿命には良くないかもしれませんが、それは解決策であり、当分の間私が持っている最高のものです.

于 2013-01-18T12:18:23.043 に答える