我的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文件在模拟器中测试了该应用程序,则可以正常运行。到目前为止,一切都很好。

但是,我阅读了以下两个链接:

Start Location Manager in iOS 7 from background task

Background Location Services not working in iOS 7
iOS7中的位置,如果位置在几分钟内没有变化,则CLLocation进入睡眠状态。

我的问题是:

我根本不叫didUpdateLocation,我只想要didEnterRegiondidExitRegion。从理论上讲,即使应用程序被杀死或者用户位置在过去一小时内未更改,然后决定移动,它是否仍能正常工作?

最佳答案

您的问题中包含一些要素:

1-为了不重新散列上一个答案中的内容,我将首先在此链接上查看我的答案。如果用户停止移动,它将帮助您解决核心位置更新停止的问题,以及如何修改该行为:
iOS7 Core Location not updating

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

3-现在您正在谈论问题中的区域,所以我假设您已实现CLCircularRegion。如果不是,那应该是第一步,然后是“startMonitoringForRegion”。在您的情况下,即使用户已停止移动一会儿然后开始移动,当该应用进入或退出某个区域时,该应用也会被唤醒/删除。

4-确保还使用locationManager:didDetermineState:forRegion:。这样一来,应用即可在启动时确定它是在区域内还是区域外。当您想到某个应用程序正在启动并且没有发生区域交叉时,这很有用,但是了解用户是在区域内部还是外部,这一点很重要。

希望这可以帮助

07-28 03:43
查看更多