我正在为客户端开发客户端/服务器应用程序,客户端是 iOS 设备。
一个客户模块适用于出差的销售人员。
我的客户希望销售人员的应用程序在销售人员离开办公室和返回办公室时自动下载其本地数据库。
我正在使用位置管理器的 startMonitoringForRegion
设置地理围栏方法,并将寻找 UIApplicationLaunchOptionsLocationKey
在启动时,以及寻找对位置管理器的调用locationManager:didEnterRegion
/locationManager:didExitRegion
来自后台的方法。
我的问题是,我如何要求系统允许我有时间建立网络连接并下载新数据以响应带有 UIApplicationLaunchOptionsLocationKey
的应用程序启动? ,或后台调用 locationManager:didEnterRegion
/locationManager:didExitRegion
?
没有一个背景模式键 ( UIBackgroundModes
) 看起来合适。
我不需要 location
键,因为我不需要实时位置信息,只需要地理围栏进入/退出消息。 fetch
key 也不是我需要的,因为这会导致系统在它选择的时间在后台唤醒我的应用程序。
我是否必须设置其中一个后台模式键才能制作 beginBackgroundTaskWithExpirationHandler
称呼?
我想我应该做的是在我的 beginBackgroundTaskWithExpirationHandler
中提交我的网络请求在我的 locationManager:didEnterRegion
/locationManager:didExitRegion
方法。系统会允许我在没有 UIBackgroundModes
的情况下这样做吗? key 集?
我可以调用beginBackgroundTaskWithExpirationHandler
吗?如果我已经在后台运行? (在应用程序正在运行但不是最前面的情况下,一个 locationManager:didEnterRegion
或 locationManager:didExitRegion
调用进来了。)我的目标是要求足够的后台时间来处理我的网络下载并将数据保存到我的本地数据库。
做过此类事情的人的任何指导都会有很大帮助。文档非常模糊,通过反复试验弄清楚如何使用后台 API 可能非常耗时。
附言尽管我是一名长期的 Objective-C 开发人员,但我正在使用 Swift 开发此应用程序。我很乐意将 Objective-C 翻译成 Swift 或根据需要混合使用 Objective-C 和 Swift,因此任何一种语言的示例都会很有用。
最佳答案
可以从后台调用beginBackgroundTaskWithExpirationHandler。从 iOS8 开始,此调用会将您的运行时间从 10 秒延长至 180 秒。
请记住,您需要为位置服务请求始终授权,这是运行区域监控所需要的。
我建议您使用后台位置 键。我忘记在我的一个应用程序中设置它,它仍然在接收区域进入/退出事件。然而,
-- 该行为可能会随着 iOS 的小升级而改变,而且
-- 应用可能被苹果拒绝
关于ios - geofence didEnterRegion/didExitRegion通知后如何进行BG NW下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30484270/