バックグラウンドでユーザーの位置を追跡するためのオープンソースアプリまたはライブラリを探しています。今、私は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件のイベントが発生します。
"Info.plist"ファイルにキーUIBackgroundModes
(配列)と値 "location"(場所の更新用のアプリレジスタ)を追加する必要があります。すべてのバックグラウンドモードをチェックできます ここ 。
したがって、アプリは位置情報サービスを使用します。次に Location Awarenessプログラミングガイド をお読みください。
Info.plistにいくつかの変更を加える必要があります。
バックグラウンドでの位置イベントの取得
アプリがフォアグラウンドかバックグラウンドかに関係なく、位置情報の更新を配信する必要がある場合、そのためのオプションがいくつかあります。優先されるオプションは、重要な位置変更サービスを使用して、適切なタイミングでアプリを起動し、新しいイベントを処理することです。ただし、アプリで標準の位置情報サービスを使用する必要がある場合は、アプリでバックグラウンドの位置情報サービスが必要であることを宣言できます。
アプリがバックグラウンドの位置情報サービスを要求するのは、それらのサービスが存在しないために操作機能が損なわれる場合のみです。さらに、バックグラウンドの位置情報サービスを要求するアプリは、それらのサービスを使用して、ユーザーに具体的なメリットを提供する必要があります。たとえば、ターンバイターン方式のナビゲーションアプリは、ユーザーの位置を追跡し、次の曲がるタイミングを報告する必要があるため、バックグラウンドの位置情報サービスの候補になる可能性があります。
あなたの問題はバックグラウンドハンドラーです。それを削除し、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");
}
あなたはあなたの中に監視場所のものを設定することができます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呼び出しを更新するたびに。
これが私の解決策でした、
インスタンス変数を宣言します。
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;
}