web-dev-qa-db-ja.com

常時稼働するiOS GPS追跡アプリ

私は常にユーザーのGPSを追跡するアプリを作成しようとしています。このアプリは、常にドライバーの位置を取得してサーバーに送信する一種の車のGPSトラッカーです。

「位置情報の更新」を「バックグラウンドモード」に追加しようとしましたが、アプリはバックグラウンドになると10分後に自動的に一時停止します。

このアプリを常に実行してGPS位置を取得する方法はありますか?

20
TMMDev

ここには2つのオプションがあります。

1)通常の位置追跡
このタイプの追跡は、kCLAuthorizationStatusAuthorizedWhenInUseおよびkCLAuthorizationStatusAuthorizedAlways認証で機能します。 CLLocationManagerが位置の追跡を開始すると、デリゲートメソッドlocationManager:didUpdateLocations:で位置の更新を受信します。アプリは一時停止状態に移行できますが、ロケーションマネージャーが新しい場所を受信すると、アプリはバックグラウンド状態に移行し、デリゲートメソッドで新しい場所を処理します。ロケーションマネージャーのセットアップ方法:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.locationManager = [[CLLocationManager alloc] init];

    // Setup location tracker accuracy
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;

    // Distance filter
    self.locationManager.distanceFilter = 50.f;

    // Assign location tracker delegate
    self.locationManager.delegate = self;

    // This setup pauses location manager if location wasn't changed
    [self.locationManager setPausesLocationUpdatesAutomatically:YES];

    // For iOS9 we have to call this method if we want to receive location updates in background mode
    if([self.locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]){
        [self.locationManager setAllowsBackgroundLocationUpdates:YES];
    }

    [self.locationManager startUpdatingLocation];
}


2)意味場所の変化の追跡。
このタイプの追跡は、kCLAuthorizationStatusAuthorizedAlways認証でのみ機能します。 500メートルごとに新しい場所を受け取るため、距離フィルターとdesiredAccuracyはここでは機能しません。アプリは一時停止状態になることも、システムによって終了されることもありますが、位置情報が更新されると、アプリはバックグラウンド状態になり、デリゲートメソッドlocationManager:didUpdateLocations:で位置情報を受け取ります。
アプリがシステムによって終了された場合、UIApplicationLaunchOptionsLocationKeyアプリデリゲートメソッドの起動オプションのdidFinishLaunchingWithOptionsキーを使用してバックグラウンドで再起動されます。追跡時にこのタイプを設定する方法:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.locationManager = [[CLLocationManager alloc] init];

    // Assign location tracker delegate
    self.locationManager.delegate = self;

    // For iOS9 we have to call this method if we want to receive location updates in background mode
    if([self.locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]){
        [self.locationManager setAllowsBackgroundLocationUpdates:YES];
    }

    [self.locationManager startMonitoringSignificantLocationChanges];
}


これらの方法はどちらも、アプリケーションが一時停止状態にならないことを保証するものではないことに注意してください。
また、アプリがユーザーによって終了された場合(たとえば、アプリスイッチャーからスワイプによって)、バックグラウンドでの位置追跡は機能しません。


[〜#〜]更新[〜#〜](コメントに対応)

これは私のために働く私のコード例です:
通常の追跡の場合 。例を実行し、ユーザーの位置情報へのアクセスを提供し、Startボタンをタップして位置情報の更新を開始します。シミュレータで場所をテストするには、シミュレータメニューの[デバッグ]> [場所]> [Freewayドライブ]を選択します。これで、アプリをホームボタン(Command + Shift + H)でバックグラウンドにプッシュできます。シミュレーターを10分以上離れると、今度はアプリが場所を受け取ります。アプリに戻ると、地図上に赤いピンが表示されます。
重要な変更の場合 。前の例と同じ方法でアプリを実行してテストします。
重要な変更の監視は、メソッド[self.locationManager startMonitoringSignificantLocationChanges];によってのみ開始できます

[〜#〜]更新[〜#〜](iOS 11)

IOS 11での位置追跡の変更

iOS 11では、既存のAPIにいくつかの大きな変更が加えられています。影響を受ける領域の1つは位置追跡です。 アプリがフォアグラウンドにあるときにアプリが位置情報のみを使用する場合、ほとんどのアプリと同様に、何も変更する必要がない場合があります。ただし、1日を通してユーザーの位置を継続的に追跡するアプリの1つである場合は、可能性のある使用シナリオの追跡とテストの方法を変更するために、この夏の時間を予約する必要があります。

このリンクをたどる: https://mackuba.eu/2017/07/13/changes-to-location-tracking-in-ios-11/

14
shpasta

it.itはバッテリーの電力を消費しますが、アプリケーションはBackground.OSで実行され、アプリはサスペンドされません

[self.locationManager setPausesLocationUpdatesAutomatically:NO];

ソリューションのコメント1への返信(まだコメントすることはできません):アプリが一時停止され、10分後に位置情報が更新されないため、問題を解決していないようです。

同じ問題が発生しました:setAllowsBackgroundLocationUpdatesYESに設定し、NSLocationAlwaysUsageDescriptionキーをInfo.plistに含めましたが、私のアプリも追跡を停止していました10分後の場所。

Info.plistファイルにNSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescriptionの両方を追加して解決したので、次のようになります。

    <key>NSLocationAlwaysUsageDescription</key>
    <string>This app needs to use your location</string>

    <key>NSLocationWhenInUseUsageDescription</key>
    <string>This app needs to use your location</string>
3
danywarner

質問は2016年2月に行われ、2019年6月に回答するので、作成者にとって有用であると確信しています。この回答は他のユーザーにとっても役立つかもしれません。

最近、同じ要件で作業していました。 2〜3週間のハードワークの後、私はそれをしました。他のユーザーのために、そのためのヘルパークラスを作成します。 GitHubで利用できます。

要件には HSLocationManager を使用してください。私のプロジェクトの1つで同じ要件を達成しました: Capchur

希望する位置精度でn秒ごとにバックグラウンドで位置情報を更新できるロケーションマネージャー。

利点:

  • ロケーションマネージャーが現在実行されている場合、OSはアプリを強制終了しません。

  • 必要に応じて定期的に位置情報を更新します(範囲は2〜170秒です(最大許容バックグラウンドタスク時間によって制限されます))。

  • カスタマイズ可能な位置精度と期間。

  • 低メモリ消費(シングルトンクラス)

2
iMHitesh Surani