1

这是我的位置管理器代码

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy=kCLLocationAccuracyNearestTenMeters;
locationManager.distanceFilter = 200;
mapView.showsUserLocation=true;
[locationManager startUpdatingLocation];      

这是另一个也用于 startupdatelocation 的函数

- (void)startLocationManager:(NSTimer *)timer
{  
   [locationManager startUpdatingLocation];
   [timer invalidate];
    timer = nil;
}

这是

 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    NSLog(@"Testing");

    CLLocationCoordinate2D location;
    location.latitude=newLocation.coordinate.latitude;
    location.longitude=newLocation.coordinate.longitude;

    [locationManager stopUpdatingLocation];

    [NSTimer scheduledTimerWithTimeInterval:60
                             target:self
                           selector:@selector(startLocationManager:)
                           userInfo:nil
                            repeats:NO];
}

这工作正常,但应用程序不在后台运行。如果我删除NStimer并且不停止位置管理器,则应用程序在后台运行得非常好。我希望位置管理器每 1 分钟运行一次以更新坐标。该应用程序还应该在后台运行。

4

1 回答 1

0

您可以查看指南(尤其是“声明您的应用支持的后台任务”部分)。它特别指出

有几种方法可以在后台跟踪用户的位置,其中大多数实际上并不需要您的应用程序在后台连续运行:

  • 重大变化的定位服务(推荐)
  • 仅前台定位服务
  • 后台定位服务

您不应该像在后台那样使用位置管理器。

为用户提供持续位置更新(即使在后台)的应用程序可以通过在其 Info.plist 文件中包含 UIBackgroundModes 键(带有位置值)来启用后台位置服务。在 UIBackgroundModes 键中包含此值不会阻止系统挂起应用程序,但它确实告诉系统它应该在有新的位置数据要传递时唤醒应用程序。因此,此键有效地让应用程序在后台运行,以便在位置更新发生时处理它们。

有一个教程,其中包含有关如何在此处执行此操作的更多信息。

于 2012-07-19T12:25:55.920 回答