在 iOS 上不断跟踪用户位置
Posted
技术标签:
【中文标题】在 iOS 上不断跟踪用户位置【英文标题】:Constantly tracking user location on iOS 【发布时间】:2014-03-04 16:11:10 【问题描述】:我需要不断监控用户的位置,以便在他接近有趣的东西时通知他。实现这一目标的正确方法是什么?
我无法让计时器在后台运行(以定期更新用户在服务器上的位置),我还了解到订阅重大位置更改可能会让我收到位置更新,即使应用程序未运行,但我不能让它发生。 我在正确的道路上吗?还有其他选择吗?
编辑 - 有一个必要条件我应该暴露出来,这可能让我失去了对真正问题的关注:
用户周围有趣的“东西”没有固定的位置,所以在发送推送之前,我必须确保用户当前在那个位置(当然我可以假设它为 n分钟)。【问题讨论】:
这个问题可能与***.com/questions/17465929/…重复 【参考方案1】:您可以在您的 VC 中设置监控位置,如下所示
在 viewDidLoad 方法中做如下
CLLocationManager locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;(Accuracy according to your need)
[locationManager startUpdatingLocation];
你必须覆盖下面两个可选的 CLLocationManagerDelegate 协议的委托方法
ios6+
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
对于 iOS 2 到 6
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
在这些方法中,您将获得更新的位置。随心所欲地使用它。每次位置更新这些方法获取调用。
【讨论】:
是的,除非这不能回答问题,因为当应用程序在后台时更新会暂停。【参考方案2】:您需要的是地理围栏。在 iOS 中,它被称为“区域监控”。您可以从 CLLocationManager
指南中的 startMonitoringForRegion:
开始。更多细节在Region Monitoring Guide
在 iOS 中,与您的应用关联的区域会一直被跟踪,包括您的应用未运行时。如果在应用程序未运行时跨越区域边界,则该应用程序将重新启动到后台以处理事件。同样,如果应用程序在事件发生时被挂起,它会被唤醒并给予一小段时间(大约 10 秒)来处理事件。
【讨论】:
【参考方案3】:据我所知,当应用程序在后台运行或未被系统挂起(终止)时,重大更改位置更新是更新当前位置的唯一方法。发生这种情况时,请务必检查 UIApplicationLaunchOptionsLocationKey 并初始化 CLLocationManager 以处理位置更改通知。如果应用程序在前台运行,那很简单。
顺便说一句,为了让系统不断更新您的应用程序的位置,您必须为项目启用地图功能和后台模式(位置更新)。
阅读 Apple 位置/地图文档了解更多详情。
【讨论】:
【参考方案4】:免责声明:我为 Cintric 工作
我们在 Cintric 也遇到过类似的问题,实际上为此目的制作了一个工具。即使在应用程序退出后,它也会在后台跟踪位置,也只使用 1% 的电池!
您可以下载 .framework 文件,将其拖到您的项目中并使用一行代码进行初始化:
[CintricFind initWithApiKey:@"YOUR_API_KEY_HERE" andSecret:@"YOUR_SECRET_HERE"];
您可以免费获得 API 密钥。
这里有文档:https://www.cintric.com/docs/ios
这里有一篇博文进一步解释:http://www.blog.cintric.com/?p=121
【讨论】:
Cintric 是否将数据发送到其云端?以上是关于在 iOS 上不断跟踪用户位置的主要内容,如果未能解决你的问题,请参考以下文章