3

我正在尝试制作一个基于位置的应用程序,该应用程序需要在打开后不断更新位置。我一直在寻找一种在应用程序关闭时将位置保留在后台的方法,但我发现这不是最好的方法,因为它会很快耗尽任何 iPhone 的电池电量。

长话短说,我发现“区域监控”是我理解的,它们与 Apple 用于其应用程序“提醒”的相同,也适用于位置。然后我使用该选项来测试我的应用程序,我意识到在模拟器中“从不”进入方法“didEnterRegion”,尽管它是正确创建的:

-(void) locationManager: (CLLocationManager *) manager didEnterRegion: (CLRegion *) region
 {
     NSLog (@ "entering the region");
     CLLocation * location1 = manager.location;
     CLLocation * location2 = [[CLLocation alloc] initWithLatitude: latitud.doubleValue longitude: longitud.doubleValue];
 }

我终于意识到该方法被调用但只有当我离开大部分区域并回到该区域时,这表明它不起作用,因为我已经在那个位置(所有这些都在模拟器中),奇怪的事情是不是,模拟器的位置距离监控区域很远!这使我认为这是准确性问题,尽管创建半径为 50 或 100 米的区域正在传播 3 或 4 公里,所以我没用。

有没有人经历过这知道 iOS 6 模拟器是否有此错误或精度问题?我还没有开发者许可证来直接在我的 iPhone 上测试它,我还不想购买它,因为我的应用程序还远未完成,我感谢任何关于这个主题的帮助。

提前致谢。

4

7 回答 7

2

我建议进行实际的地面测试。区域监控精度因测试位置而异。

第二种选择是使用区域监控来唤醒应用程序并启动标准位置服务。为此,您需要获得在后台运行应用程序的权限。苹果可能不会批准这一点。我们的应用程序使用这种方法被拒绝了。

于 2013-03-06T19:59:31.490 回答
2

DidEnterRegion 和 ExitRegion 不是很准确。大约 +, - 150m 精度。

但是 -(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 非常准确。使用它来找出您的地区有坐标/当前位置

CLLocation *currentLocation = [locations lastObject];

 if ([self.ARegionYouSetBeforeHand containsCoordinate:currentLocation.coordinate])
{
 //you arrived at this region!!
}
于 2014-04-14T03:28:23.720 回答
1

区域监控(通常)与“重大位置变化”定位服务的工作基础相同。也就是说,它使用手机信号塔位置;Apple 建议您通常可以预期 1 公里左右的精度,但警告说实际精度会随您所在地区的手机信号塔的密度而变化。您可以在 Core Location 上的WWDC 视频中找到有关此主题的更多背景信息。

使用区域监控来(唤醒您的应用程序并)对用户的位置进行一般猜测,然后使用更高精度的模式CLLocationManager来获得更精确的修复,这可能是可行的——我没有尝试过。

于 2012-12-21T06:35:55.803 回答
0

完成时,我意识到区域监控的准确性对于大多数用途来说已经足够了,但在模拟器中可能会很棘手,因为它没有 GPS 或手机硬件,无论如何,当我在我的设备中使用“区域监控”时,即使在模拟路线中也是如此该功能正常工作。

甚至为了更准确,我将 CLLocationManager 的方法“startUpdatingLocation”调用到方法“didEnterRegion”中,这对我来说很有效。

于 2013-02-04T00:05:09.150 回答
0

我在 iPhone 5C 上使用蜂窝塔移动数据进行区域监控时遇到了同样的问题,禁用 WiFi,当我距离保持区域半径为 100.0 的监控点 1.95 公里时,我习惯于很快调用 didEnterRegion米。这还为时过早。

Apple 有一些阈值,由当前可用的硬件和定位技术决定。所以对我来说,它可能是大约 1800 米的早期价值。

我建议保持最小半径(例如 25.0 代表 500.0 区域)或者如果通知如此珍贵,请使用 didUpdateLocations 委托方法并确定您的区域并通知相同。

问候,考希克

于 2015-09-09T07:41:27.480 回答
0

MK MapView 上的预定义 GPS 精度

  1. kCLLocationAccuracyBestForNavigation – 使用
    由附加传感器数据增强的最高可能精度级别。


  2. kCLLocationAccuracyBest – 建议使用电池供电的设备的最高准确度级别。

  3. kCLLocationAccuracyNearestTenMeters - 精确到 10 米以内。

  4. CLLocationAccuracyHundredMeters – 精确到 100 米以内。

  5. kCLLocationAccuracyKilometer – 精确到一公里以内。

  6. kCLLocationAccuracyThreeKilometers – 精确到三
    公里以内。

用法:

var locationManager: CLLocationManager = CLLocationManager()

    //MapView Location
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    locationManager.requestWhenInUseAuthorization()
    locationManager.startUpdatingLocation()
    locationManager.startUpdatingHeading()
于 2016-03-30T13:54:10.287 回答
0

我发现内置的区域监控不足以满足我的需求。如果您需要更高的准确度,请先适当设置准确度,然后您可以使用以下内容:

(使用与@coolcool1994 相同的方法,但更深入一点并使用 Swift 2.1。记得设置CLLocationManager及其委托(下面的函数将驻留),并开始接收位置更新)

var activeRegions = Set<String>()
var monitoredRegions = [
  CLCircularRegion(center: CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0),
    radius: 300, identifier: "Region1"),
  CLCircularRegion(center: CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0),
    radius: 300, identifier: "Region2")
]

func manuallyUpdateActiveRegionsFromLocation(location: CLLocation){
  // Optionally explicitly reject unwanted location updates
  // Setting the location manager delegate's desiredAccuracy should be enough
  let maxOldTime = 300 //5 minutes
  let minAccuracy = 300 //300 metres
  if abs(location.timestamp.timeIntervalSinceNow) > maxOldTime
    || location.horizontalAccuracy > minAccuracy {
      return
  }

  for monitoredRegion in monitoredRegions {
    if monitoredRegion.containsCoordinate(location.coordinate) {
      activeRegions.insert(monitoredRegion.identifier)
    } else {
      activeRegions.remove(monitoredRegion.identifier)
    }
  }

}

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
  if let location = locations.last {
    manuallyUpdateActiveRegionsFromLocation(location)
  }
}
于 2016-02-07T19:05:29.437 回答