如何每5秒获得高精度位置,或者当用户在不耗尽电池的情况下移动阈值时?

时间:2016-08-25 03:17:44

标签: ios iphone

我有一个位置应用,需要定期获得准确的位置。目前我不断获得didUpdateLocation的位置,但我每隔5秒就会记录一次该位置。我对能够定期获得准确位置或意外更改的解决方案感兴趣。我想要其中一个或两个场景: (非常准确,我需要10米的精确度)

  • 每5秒获取一个非常准确的位置
  • 如果用户移动阈值(例如移动5 - 10米),则通知/回叫

应用程序需要在后台运行时工作,如果用户切换到另一个应用程序,仍必须记录位置。

我正在考虑每隔5秒打开/关闭位置,但不确定这是否是最佳做法。我也知道还有allowDeferredLocationUpdatesUntilTraveled但我相信只适用于背景模式。我很感激在应用程序处于使用状态和后台模式时节省电池的解决方案。请分享您的用例的解决方案和最佳实践。

1 个答案:

答案 0 :(得分:1)

我确实使用位置服务编写了应用,应用必须每10秒发送一次位置。而且效果很好。

只需按照Apple的文档使用"allowDeferredLocationUpdatesUntilTraveled:timeout"方法。

步骤如下:

必需:注册更新位置的后台模式。

  1. 创建LocationManger和startUpdatingLocation,精确度和filteredDistance为您想要的任何内容:

    -(void) initLocationManager    
    {
     // Create the manager object
     self.locationManager = [[[CLLocationManager alloc] init] autorelease];
     _locationManager.delegate = self;
    // This is the most important property to set for the manager. It ultimately determines how the manager will
    // attempt to acquire location and thus, the amount of power that will be consumed.
    _locationManager.desiredAccuracy = 45;
    _locationManager.distanceFilter = 100;
    // Once configured, the location manager must be "started".
    [_locationManager startUpdatingLocation];
    }
    
  2. 为了让应用程序在后台使用“allowDeferredLocationUpdatesUntilTraveled:timeout”方法永远运行,当app移动到后台时,必须使用新参数重新启动updatesLocation,如下所示:

    - (void)applicationWillResignActive:(UIApplication *)application {
     _isBackgroundMode = YES;
    
     [_locationManager stopUpdatingLocation];
     [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
     [_locationManager setDistanceFilter:kCLDistanceFilterNone];
      _locationManager.pausesLocationUpdatesAutomatically = NO;
      _locationManager.activityType = CLActivityTypeAutomotiveNavigation;
     [_locationManager startUpdatingLocation];
     }
    
  3. App使用“locationManager:didUpdateLocations:”回调正常更新地点:

    -(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    {
     //  store data
     CLLocation *newLocation = [locations lastObject];
     self.userLocation = newLocation;
    
     //tell the centralManager that you want to deferred this updatedLocation
    if (_isBackgroundMode && !_deferringUpdates)
    {
    _deferringUpdates = YES;
    [self.locationManager allowDeferredLocationUpdatesUntilTraveled:CLLocationDistanceMax timeout:10];
     }
    }
    
  4. 但你应该为你的目的处理“locationManager:didFinishDeferredUpdatesWithError:”回调中的数据

    - (void) locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error {
    
     _deferringUpdates = NO;
    
     //do something 
     }
    
  5. 注意:我认为每次应用程序在后台/外围模式之间切换时,我们都应该重置LocationManager的参数。
  6. 希望这应该有所帮助