20

我正在寻找一个开源应用程序或库来在后台跟踪用户位置。现在我正在尝试使用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 个触发事件

4

8 回答 8

7

利用

kCLLocationAccuracyBestForNavigation

检查这个

于 2013-07-13T00:12:50.850 回答
6

您需要在“Info.plist”文件中添加UIBackgroundModes值为“location”的键(数组)(应用程序注册位置更新)。您可以在此处检查所有背景模式。

于 2013-07-15T22:32:50.617 回答
4

所以你的应用使用了定位服务。然后请阅读位置感知编程指南

您需要对 Info.plist 进行一些更改:

  • 如果您的应用依赖位置服务才能正常运行,请将位置服务添加到 UIRequiredDeviceCapabilities
  • 如果您的应用需要 GPS 硬件,请将 gps 添加到 UIRequiredDeviceCapabilities
  • 如果您需要在后台运行您的应用程序超过 10 分钟,请将位置添加到 UIBackgroundModes。然后,您的位置经理将提供超过 10 分钟限制的位置。
  • 您还应该设置 NSLocationUsageDescription (也可以本地化)

在后台获取位置事件

如果您的应用需要在前台或后台提供位置更新,则有多种选择。首选选项是使用重大位置更改服务在适当的时间唤醒您的应用程序以处理新事件。但是,如果您的应用需要使用标准位置服务,您可以将您的应用声明为需要后台位置服务。

仅当缺少这些服务会影响其运行能力时,应用程序才应请求后台位置服务。此外,任何请求后台定位服务的应用程序都应该使用这些服务为用户提供切实的好处。例如,逐向导航应用程序可能是后台定位服务的候选者,因为它需要跟踪用户的位置并报告下一次转弯的时间。

于 2013-07-17T11:02:15.183 回答
3

您的问题是后台处理程序。删除它并在 plist 文件中启用 gps 后台模式。那么您应该始终获得全功率gps。

设置属性pausesLocationUpdatesAutomatically=NO

这是ios6中的新功能。

CLLocationManager

允许位置管理器暂停更新可以在不牺牲位置数据的情况下延长目标设备的电池寿命。当此属性设置为 YES 时,位置管理器会在位置数据不太可能更改时暂停更新(并关闭适当的硬件)。例如,如果用户在使用导航应用时停下来吃东西,位置管理器可能会暂停更新一段时间。您可以通过为 activityType 属性分配值来帮助确定何时暂停位置更新。

此属性的默认值为 YES。

为了分析,将这些方法添加到您的 LocationManager 委托中:

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

- (void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager {
    NSLog(@"locMan: locationManagerDidResumeLocationUpdates");
}
于 2013-07-04T19:38:53.380 回答
2

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

在 viewDidLoad 方法中做如下

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

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

适用于 iOS6+

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

对于 iOS 2 到 6

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

在这些方法中,您将获得更新的位置。随心所欲地使用它。每次位置更新这些方法获取调用。

于 2013-07-04T11:00:56.447 回答
1

你不要求代码。您要求:“我正在寻找开源应用程序或库”

它可以帮助您访问网站。

希望对你有帮助

还有教程

于 2013-07-17T08:22:00.417 回答
0

这是我的解决方案,

声明实例变量:

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;
}
于 2013-07-17T05:50:18.423 回答
-3

免责声明:我为 Cintric 工作

我们还希望能够在后台准确跟踪用户的位置(即使在应用程序被杀死之后)。我们花了很长时间解决这个问题,特别是关注电池消耗。

我们发布了一篇很棒的博客文章,介绍了我们如何解决它。并且还提供拖放 SDK 解决方案。它不是开源的,但您可以免费集成它:

您可以下载 .framework 文件,将其拖到您的项目中并使用一行代码进行初始化: [CintricFind initWithApiKey:@"YOUR_API_KEY_HERE" andSecret:@"YOUR_SECRET_HERE"];

您可以免费获得 API 密钥。这里有解释所有内容的文档。

于 2014-10-27T00:15:27.240 回答