3

CLLocationManager从用户第一次进入应用程序时开始。我正在像这样初始化它:

self.locationManager = [[CLLocationManager alloc] init];
            self.locationManager.delegate = self;
            self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
            self.locationManager.distanceFilter = kDistanceFilter;
            self.locationManager.headingFilter = kHeadingFilter;

我正在使用地理围栏。

我在我的 .plist 中定义了required background modes.

如果我使用 gpx 文件在模拟器中测试应用程序,它工作正常。到现在为止还挺好。

但是,我在这两个链接中阅读:

从后台任务启动 iOS 7 中的位置管理器

后台定位服务在 iOS 7 中不起作用

也就是说iOS7,当位置在几分钟内没有改变时,CLLocation就会进入睡眠状态。

我的问题是:

我根本不打电话didUpdateLocation,我只想要didEnterRegion, 或didExitRegion。从理论上讲,即使应用程序被杀死或用户位置在最后一小时内没有改变然后决定移动,它会起作用吗?

4

1 回答 1

2

您的问题中有几个要素:

1-为了不重复先前答案中的内容,我将首先在此链接中查看我的答案。如果用户停止移动,它将帮助您解决核心位置更新停止以及如何修改该行为: iOS7 核心位置未更新

2- 如果用户在 iOS7 中杀死了一个应用程序(通过在应用程序切换器中轻弹它),该应用程序将不会重新启动,因此您的位置更新和区域监控都不会在手机重新启动后重新启动。另一方面,如果应用程序因内存压力而被终止,iOS 将重新启动应用程序并在后台重新启动您的位置更新和区域监控。此外,如果您重新启动手机,区域监控将自动重新启动。您显然必须启用后台模式。

3-现在您正在谈论问题中的区域,所以我假设您已经实施了 CLCircularRegion。如果没有,那应该是第一步,然后是“startMonitoringForRegion”。在您的情况下,即使用户停止移动一段时间然后开始移动,当应用程序进入或退出区域时,应用程序也会被唤醒/委托调用。

4- 确保也使用 locationManager: didDetermineState: forRegion:。这将允许应用程序在开始时确定它是在区域内还是在区域外。当您认为应用程序正在启动并且没有发生跨区域时,这很有用,但重要的是要知道用户是在区域内还是在区域外。

希望这可以帮助

于 2014-01-14T17:15:49.830 回答