web-dev-qa-db-ja.com

アプリが終了/一時停止されたときのバックグラウンドユーザーの場所

私は、アプリの移動と同じように、アプリが終了したときにユーザーの位置を取得する方法を見つけようとしてきました。私がそうすることを知っている唯一の方法は、重要な場所の変更を使用することです。ただし、場所が大幅に変更された場合、アプリは500メートルごとに、最後の更新から約5分経過した場合にのみ起動されます。

Appleによると:

アプリは、デバイスが以前の通知から500メートル以上移動するとすぐに通知を期待できます。 5分に1回よりも頻繁に通知を期待するべきではありません。デバイスがネットワークからデータを取得できる場合、ロケーションマネージャはタイムリーに通知を配信する可能性がはるかに高くなります。

Movesアプリでは、アプリを終了しても、バッテリーをあまり消耗することなく、ユーザーの位置を非常に正確に取得できます。また、バッテリー使用量リストに「バックグラウンドアクティビティ」のみが表示されているため、バックグラウンドロケーションがオンになっていないようです。だから私はMovesのようなアプリがこれをどのように行っているのか疑問に思っています。どんな助けでも素晴らしいでしょう!ありがとう。

26
Zack

500mエリアの地域に登録し、通知地域通知に登録することができます。それらが1つに達すると、アプリはバックグラウンドで起動されます。次に、その場所を中心に保ちながら、新しいものに再登録します。

enter image description here

から Appleのドキュメント

バックグラウンド実行をサポートするアプリは、着信イベントを処理するためにシステムによって再起動される場合があります。ユーザーがアプリを強制終了する以外の理由でアプリが終了した場合、システムは次のいずれかのイベントが発生したときにアプリを起動します。

ロケーションアプリの場合:

  • システムは、アプリで構成された配信基準を満たす場所の更新を受信します。

  • デバイスは、登録された領域に出入りしました。 (リージョンは、地理的リージョンまたはiBeaconリージョンにすることができます。)

4
Sahil Kapoor

場所の更新が頻繁に必要であるが、それでもバッテリー寿命を節約したい場合は、これを試してください-

  1. バックグラウンドで場所を使用するために必要な権限を追加します。
  2. startUpdatingLocationを使用して更新を開始します
  3. allowDeferredLocationUpdatesUntilTraveled:timeout:を使用して、バックグラウンドで更新の延期を開始します。このメソッドで時間と距離のフィルターを指定します。
  4. ドキュメントを読んでください ここ そしてそれを機能させるためにすべてのプロパティを正しく指定してください。
3
Shri

唯一の解決策は、CoreLocationでバックグラウンドモードを使用することです。アプリにiOS8が必要な場合、ユーザーが強制的に終了した場合でも、システムはアプリを再起動します。これは Apple Docs に記載されています:

ほとんどの場合、ユーザーがアプリを強制終了した後、システムはアプリを再起動しません。 1つの例外は、ロケーションアプリです。これは、iOS 8以降では、ユーザーによって強制的に終了された後に再起動されます。ただし、それ以外の場合は、アプリをシステムによってバックグラウンドで自動的に起動する前に、ユーザーがアプリを明示的に起動するか、デバイスを再起動する必要があります。

2
rmp

iOS 8では、これらはロケーションフェッチを機能させるために注意を払う必要のある新しいステップです。最初のステップは、アプリの主な機能に応じて、プロジェクトの.plistに1つまたは2つのキーを追加することです。 2つのキーはNSLocationWhenInUseUsageDescriptionとNSLocationAlwaysUsageDescriptionです。次に、アプリが現在地にアクセスする必要がある理由をユーザーに説明する文字列を追加する必要があります。 BとC」。これらの各文字列には、WhenInUseまたはAlway(つまり、バックグラウンド)を呼び出す必要がある対応する認証メソッドがあります。

- (void)startStandardUpdates
{
    // Create the location manager if this object does not
    // already have one.
    if (nil == locationManager)
        locationManager = [[CLLocationManager alloc] init];

    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;

    // Set a movement threshold for new events.
    locationManager.distanceFilter = 500; // meters

    [locationManager startUpdatingLocation];
}
1
mrunal thanki

私の現在の経験から、これを機能させるには3つのオプションがあります。 1つ目は、バックエンドによる作業を必要とするサイレント通知を行うことです。サイレント通知は一種のプッシュ通知ですが、アラートなしでアプリに通知します。 2番目の解決策はバックグラウンドフェッチです。バックグラウンドフェッチにはバックエンドソリューションは必要ありませんが、残念ながら、インスタンス化に必要な間隔を制御することはできません。 3つ目は、メッセージなしでローカル通知をスケジュールすることです。

0
Ashraf Tawfeeq

ドキュメントから

ユーザーの場所の追跡

バックグラウンドでユーザーの位置を追跡する方法はいくつかありますが、そのほとんどは、アプリをバックグラウンドで継続的に実行する必要はありません。

The significant-change location service (Recommended)

Foreground-only location services

Background location services

バックグラウンド実行

詳細については--- ユーザーの場所の取得

0
jarryd