web-dev-qa-db-ja.com

バックグラウンドでユーザーの位置を追跡する方法は?

バックグラウンドでユーザーの位置を追跡するためのオープンソースアプリまたはライブラリを探しています。今、私はCLLocationとバックグラウンドタスクでそれを実行しようとしていますが、私の場合は正確性では不十分です。 「moves」、「runkeeper」、「endmondo」などのアプリがどのように私のルートを作成するのか説明していただけますか?加速度計またはコンパス、あるいはその両方を使用して、CLLocationの背景ポイント間のルートを作成する必要がありますか?

いくつかのコード:

//location manager init
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.distanceFilter = kCLDistanceFilterNone;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.delegate = self;


#pragma mark - CLLocationManager Delegate

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

    if ([self isInBackground]) {
        if (self.locationUpdatedInBackground) {
            bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: ^{
                [[UIApplication sharedApplication] endBackgroundTask:bgTask];
            }];

            self.locationUpdatedInBackground(newLocation);
            [self endBackgroundTask];
        }
    } else {
        if (self.locationUpdatedInForeground) {
            self.locationUpdatedInForeground(newLocation);
        }
    }
}

UPD:Justedが次のプロパティでアプリをテストしました

self.locationManager.distanceFilter = kCLDistanceFilterNone;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.activityType = CLActivityTypeFitness;
self.locationManager.pausesLocationUpdatesAutomatically=NO;

この場合、1.5時間の旅行中に約10件のイベントが発生します。

20
Alexey Sidorov

使用する

kCLLocationAccuracyBestForNavigation

チェック this

7

"Info.plist"ファイルにキーUIBackgroundModes(配列)と値 "location"(場所の更新用のアプリレジスタ)を追加する必要があります。すべてのバックグラウンドモードをチェックできます ここ

6
Maxime Berail

したがって、アプリは位置情報サービスを使用します。次に Location Awarenessプログラミングガイド をお読みください。

Info.plistにいくつかの変更を加える必要があります。

  • アプリが位置情報サービスに依存して適切に機能する場合は、位置情報サービスをUIRequiredDeviceCapabilitiesに追加します
  • アプリにGPSハードウェアが必要な場合は、gpsをUIRequiredDeviceCapabilitiesに追加します
  • バックグラウンドで10分より長くアプリを実行する必要がある場合は、UIBackgroundModesに場所を追加します。次に、ロケーションマネージャーが10分の制限を超えてロケーションを提供します。
  • nSLocationUsageDescriptionも設定する必要があります(ローカライズすることもできます)

バックグラウンドでの位置イベントの取得

アプリがフォアグラウンドかバックグラウンドかに関係なく、位置情報の更新を配信する必要がある場合、そのためのオプションがいくつかあります。優先されるオプションは、重要な位置変更サービスを使用して、適切なタイミングでアプリを起動し、新しいイベントを処理することです。ただし、アプリで標準の位置情報サービスを使用する必要がある場合は、アプリでバックグラウンドの位置情報サービスが必要であることを宣言できます。

アプリがバックグラウンドの位置情報サービスを要求するのは、それらのサービスが存在しないために操作機能が損なわれる場合のみです。さらに、バックグラウンドの位置情報サービスを要求するアプリは、それらのサービスを使用して、ユーザーに具体的なメリットを提供する必要があります。たとえば、ターンバイターン方式のナビゲーションアプリは、ユーザーの位置を追跡し、次の曲がるタイミングを報告する必要があるため、バックグラウンドの位置情報サービスの候補になる可能性があります。

4
Ravi_Parmar

あなたの問題はバックグラウンドハンドラーです。それを削除し、plistファイルでgpsバックグラウンドモードを有効にします。その後、常にフルパワーのGPSを取得する必要があります。

プロパティを設定pausesLocationUpdatesAutomatically=NO

これはios6の新機能です。

From CLLocationManager

Location Managerが更新を一時停止できるようにすると、ロケーションデータを犠牲にすることなく、ターゲットデバイスのバッテリー寿命を改善できます。このプロパティがYESに設定されている場合、ロケーションマネージャーは、ロケーションデータが変更される可能性が低いときに更新を一時停止します(および適切なハードウェアの電源を切ります)。たとえば、ナビゲーションアプリの使用中にユーザーが食べ物を食べに立ち寄った場合、ロケーションマネージャーは一定期間、更新を一時停止することがあります。 activityTypeプロパティに値を割り当てると、位置の更新を一時停止するタイミングの決定に役立ちます。

このプロパティのデフォルト値はYESです。

分析のために、これらのメソッドをLocationManagerデリゲートに追加します。

- (void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager {
     NSLog(@"locMan: locationManagerDidPauseLocationUpdates");
}

- (void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager {
    NSLog(@"locMan: locationManagerDidResumeLocationUpdates");
}
3
AlexWien

あなたはあなたの中に監視場所のものを設定することができますVC

viewDidLoadメソッドでは、次のようにします

CLLocationManager locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;(Accuracy according to your need)
[locationManager startUpdatingLocation];

cLLocationManagerDelegateプロトコルの2つのオプションのデリゲートメソッドの下で上書きする必要があるより

iOS6以降

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{}

iOS 2から6

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

これらのメソッドでは、更新された場所を取得します。好きなように使ってください。場所がこれらのメソッドのget呼び出しを更新するたびに。

2

コードを要求しません。 「オープンソースのアプリまたはライブラリを探しています」

this のWebサイトにアクセスすると役立つ場合があります。

お役に立てば幸いです。

また チュートリアル

1
Marc Millet

これが私の解決策でした、

インスタンス変数を宣言します。

CLLocationManager *locationManager;

必ずデリゲートを含めてください

<CLLocationManagerDelegate>

ViewDidLoadで:

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move, location is updated
locationManager.desiredAccuracy = kCLLocationAccuracyBest; // get best current locaton coords
locationManager.headingFilter = 1;
[locationManager startUpdatingLocation];
[locationManager startUpdatingHeading];

デリゲートメソッドを実装します。

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    int degrees = newLocation.coordinate.latitude;
    double decimal = fabs(newLocation.coordinate.latitude - degrees);
    int minutes = decimal * 60;
    double seconds = decimal * 3600 - minutes * 60;
    NSString *lat = [NSString stringWithFormat:@"%d° %d' %1.4f\"",
                     degrees, minutes, seconds];
    NSLog(@" Current Latitude : %@",lat);
    latitudeLocation.text = lat;
    degrees = newLocation.coordinate.longitude;
    decimal = fabs(newLocation.coordinate.longitude - degrees);
    minutes = decimal * 60;
    seconds = decimal * 3600 - minutes * 60;
    NSString *longt = [NSString stringWithFormat:@"%d° %d' %1.4f\"",
                       degrees, minutes, seconds];
    NSLog(@" Current Longitude : %@",longt);
    longitudeLocation.text = longt;
}
0
jsetting32