如何在后台跟踪用户位置?

Ale*_*rov 20 geolocation core-location ios cllocationdistance ios6

我正在寻找一个开源应用程序或库来跟踪后台的用户位置.现在我正在尝试使用CLLocation和后台任务,但准确性对我的情况来说还不够.你能解释一下,像"移动","管理员","endmondo"等应用程序如何创建我的路线?我应该使用Accelerometer或/和指南针在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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

UPD:Justed使用下一个属性测试了我的应用程序

self.locationManager.distanceFilter = kCLDistanceFilterNone;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.activityType = CLActivityTypeFitness;
self.locationManager.pausesLocationUpdatesAutomatically=NO;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我在1.5小时旅行期间有大约10个被解雇的事件

Phi*_*aze 7

使用

kCLLocationAccuracyBestForNavigation

检查一下.


小智 6

您需要在"Info.plist"文件中添加UIBackgroundModes值为"location" 的键(数组)(应用程序寄存器用于位置更新).您可以在此处查看所有背景模式.


Sur*_*rma 2

您可以在 VC 中设置监控位置,如下所示

在 viewDidLoad 方法中执行以下操作

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

比您必须覆盖 CLLocationManagerDelegate 协议的以下两个可选委托方法

适用于 iOS6+

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{}
Run Code Online (Sandbox Code Playgroud)

适用于 iOS 2 至 6

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
Run Code Online (Sandbox Code Playgroud)

在这些方法中,您将获得更新的位置。根据需要使用它。每次位置更新时,都会调用这些方法。