我们正在尝试创建一个应用程序,当手机存在信标/ iBeacon时,该应用程序会记录旅程的GPS日志。例如,如果您将信标放入汽车,那么您的所有汽车旅程都将自动记录。
但是我们马上就遇到了问题。如果我们在前台记录应用程序的旅程,一切正常。但是,如果我们从DidRangeBeacons()回调开始记录旅程,我们似乎只获得10秒的数据然后应用程序被暂停。我们已将所需的属性放在Info.plist文件中:
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
此外,应用程序已正确注册,以便在后台运行时允许位置监控(并在必要时调用locMgr.RequestAlwaysAuthorization()),并且在iOS的“位置隐私”屏幕上看起来都很正常。
有些东西似乎阻止操作系统识别应用程序有权在后台跟踪位置。或者我们可能通过直接调用DidRangeBeacons()回调中的CLLocationManager.StartUpdatingLocation()来以错误的方式开始位置监控。
我们可以采取哪些措施来解决这个10秒的限制,我们似乎正在打击?
我们在这个例子中使用Xamarin,但是如果我们在Objective C中,我确信我们会遇到同样的问题,因为我怀疑这是一个滥用API的设计问题,因此任何帮助或代码示例来自任何一个平台都会有用。
答案 0 :(得分:1)
仅仅因为设置了UIBackgroundModes
location
,并不意味着iOS对在后台运行的应用没有任何限制。请阅读Using Location Services in the Background了解详情。
信标区域输入事件通常将您限制为10秒的背景范围(以及其他后台操作)。你可以通过描述的here.技术将这10秒延长到180秒。在背景模式下,你应该能够无限延长。
答案 1 :(得分:1)
要确保应用继续接收位置更新,您应该开始background task。这将确保您的应用不会被暂停。通常情况下,后台任务允许执行3分钟,但如果您在plist(您所做的)中指定了位置后台权限,则您将有无限时间。如果应用程序需要为另一个前台应用程序释放内存,那么应用程序可能会被操作系统终止。但是,您也可以monitor for significant location change。这将触发大约每500m-1km(作为蜂窝塔和可用的wifi网络周围的变化)并且实际上将重新启动应用程序(如果它被终止)(作为信标监视服务)。这有意义吗?