如何每隔n分钟在iOS应用程序中获取后台位置更新?
|
我正在寻找一种方法来在我的iOS应用程序中每隔n分钟获取一次后台位置更新。我正在使用iOS 4.3,该解决方案应该适用于非越狱的iPhone。
我尝试/考虑了以下选项:
CLLocationManager startUpdatingLocation/startMonitoringSignificantLocationChanges
:根据配置的属性,它可以在后台正常工作,但是似乎无法强迫它每n分钟更新一次位置
NSTimer
:当应用程序在前台运行但似乎不是为后台任务设计的时,它可以工作
本地通知:可以每n分钟安排一次本地通知,但是无法执行一些代码来获取当前位置(无需用户通过通知启动应用程序)。这种方法似乎也不是一种干净的方法,因为这不是通知的用途。
UIApplication:beginBackgroundTaskWithExpirationHandler
:据我了解,当应用程序移至后台时,应使用它在后台完成一些工作(时间也受限制),而不是执行“长时间运行”后台进程。
如何实施这些常规的后台位置更新?
没有找到相关结果
已邀请:
15 个回复
澳绍能
用
在背景中创建
当
小于
时,它将正常工作。当
较大时,应在没有剩余时间避免后台任务被杀死之前再次启用(和禁用)and9ѭ。 之所以可行,是因为位置是后台执行的三种允许类型之一。 注意:我通过在不起作用的模拟器中进行测试来浪费了一些时间。但是,它可以在我的手机上正常工作。
陈獭
俺呵誓放胳
添加
对象。现在,您需要做的是在应用程序中的任何位置启动位置更新:
接下来,编写一种方法来处理位置更新, 在应用程序委托中说
。然后在启动位置管理器的类中实现
的方法
(因为我们将位置管理器委托设置为\'self \')。在此方法内,您需要检查必须经过的时间间隔(必须在该时间间隔之后)。您可以通过每次保存当前时间来做到这一点。如果该时间已过,请从您的应用程序委托中调用方法UpdateLocation:
即使您的应用程序处于后台,这也会每5分钟调用一次您的方法。 小知识:此实现会消耗掉电池电量,如果您的位置数据的准确性不是很关键,则应使用ѭ18 将其添加到您的应用之前,请阅读位置感知编程指南
坝镰补翔奋
只是这样测试: 我启动了该应用程序,进入后台并在车上行驶了几分钟。然后我回家1个小时,然后再次开始移动(无需再次打开该应用程序)。位置再次开始。然后停了两个小时,然后重新开始。一切还好... 不要忘记在iOS6中使用新的定位服务
森含械
只是不要忘记在info.plist中添加“用于位置更新的应用程序注册”。
僻朵庙惩竣
我像这样在AppDelegate中开始跟踪:
田损比报
仅会呼叫
,这仅在三个位置服务(蜂窝塔,gps,wifi)之一感知到更改时才会发生。 其他可能有助于进一步解决方案的问题: 启动和停止服务将导致调用
委托方法,但是
可能具有较旧的时间戳。 区域监控可能会有所帮助 在后台运行时,请注意,可能很难获得Apple批准的“完整” LocationServices支持。据我了解,他们专门为需要后台位置支持的应用程序设计了28英镑的低功耗替代方案,并强烈鼓励开发人员使用此应用程序,除非该应用程序绝对需要它。 祝好运! 更新:这些想法可能现在已经过时。上面的@wjans回答似乎使人们获得了成功。
断跑胺弄萎
和
,并根据需要选择
和
:
2.为使应用程序在后台永久使用
方法运行,必须在应用程序移至后台时使用新参数重新启动
,如下所示:
3.应用程序通过
回调正常获取updatedLocations:
4.但是您应该根据自己的目的在then39ѭ回调中处理数据
5.注意:我认为每次应用在背景/地面模式之间切换时,我们都应重置ѭ41的参数。
咖哀烈
自iOS 9起,这对于后台位置跟踪来说是必需的。
垫歌蝎降凤
),并对其进行了扩展。我想确保自己获得了所需的准确度,并且通过保持GPS无线电的开启超过必要水平,也没有耗尽电池电量。 我通过以下设置使位置信息连续运行:
这是一个相对较低的电池消耗。当我准备好获取下一个定期的位置读数时,我首先要检查该位置是否在所需的精度范围内,如果可以,则使用该位置。如果不是,那么我通过以下方法提高准确性:
确定我的位置,然后找到位置,然后再次降低精度,以最大程度地减少电池消耗。我已经编写了一个完整的工作示例,还编写了服务器端代码的源代码以收集位置数据,将其存储到数据库中,并允许用户实时查看gps数据或检索和查看以前存储的路由。我有iOS,Android,Windows Phone和Java的客户端。所有客户端都是本地编写的,它们都在后台正常工作。该项目是MIT许可的。 iOS项目针对使用iOS 7基本SDK的iOS6。您可以在此处获取代码。 如果发现任何问题,请在github上提交问题。谢谢。
笛驮型迸
看来可以有效关闭GPS的电源。然后,背景NSTimer的选择器变为:
我正在做的是定期地每隔几分钟切换一次精度以获取高精度坐标,并且由于locationManager尚未停止,backgroundTimeRemaining保持在最大值。这将电池消耗从每小时约10%(在后台始终保持kCLLocationAccuracyBest不变)降低到每小时在我的设备上约2%
广躺椽
该存储库还包含一个用Swift 3编写的示例应用程序。
泪琉踞檄
完趣镐
保持locationManager一直运行 在剩余的等待时间内,将
在ѭ51for(获取位置的5秒钟)和
之间切换,以免耗尽电池 本示例在前景中每1分钟更新一次位置,在背景中每15分钟更新一次位置。 该示例可与在iOS 7设备上运行的Xcode 6 Beta 6完美配合。 在应用程序委托中(mapView是指向mapView控制器的可选指针)
在mapView中(locationManager指向AppDelegate中的对象)
缮记箔
第三步 将此代码添加到AppDelegate.m中的applicationDidEnterBackground方法中