我对iOS开发相对较新,我正在开发一个Swift 3/iOS 10应用程序,收集GPS位置数据并显示用户在地图上的位置。该应用程序还通过HTTP POST将位置数据发送到Web服务器。数据传输发生在用户可配置的时间间隔内,范围从一分钟一次到一次一次。概括地说,这基本上是我在做什么:iOS 10在应用程序处于后台时进行HTTP POST
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if let location = locations.last {
// determine if it's time to send the location data
// if so, create new job and send it to job manager for execution
// this job performs the following:
// serialize location data to protobuf
// encrypt protobuf
// HTTP POST encrypted data to web server
}
}
我前面引用的作业管理基本上是1)坚持一个领域数据库的工作; 2)在FIFO顺序执行的作业队列。
到目前为止,这似乎是按预期工作。但是,我注意到,当用户按下主页按钮,我的应用程序发送到后台/被暂停时,我继续获取位置更新,但我的HTTP POST似乎最终停止工作。
我使用Alamofire 4.0.1来制作HTTP POST。我已经添加登录的代码,我看到web请求被称为每次:
NSLog("About to POST location data...")
// urlRequest.body = encrypted protobuf
alamoFireSessionManager.request(urlRequest).validate().responseJSON() {
NSLog("Inside response JSON handler!")
if response.result.isSuccess {
NSLog("HTTP POST was successful!")
} else {
NSLog("HTTP POST failed!")
}
}
正如我所说的,当我的应用程序被发送到后台/暂停,我继续得到位置更新一段时间后,HTTP POST继续正常工作(我可以看到服务器上收到的位置数据)。但是,最终,我停止看到数据被发送到服务器,并且我没有看到Alamofire响应JSON处理程序执行内的任何代码。在我的应用程序日志中,我始终看到字符串"About to POST location data..."
,但最终"Inside response JSON handler!"
消息停止显示。
正如我所说,我相当新的iOS,所以我可能会丢失一些关于操作系统如何对待后台操作的基本知识。这种行为表明iOS允许我的应用程序在后台工作一段时间,但最终阻止它最终进行网络调用?如果是这样,有另一种方式可以在应用程序处于后台时以特定间隔可靠地执行重复性HTTP POST吗?
不幸的是,背景获取对我来说并不是一个好的解决方案,因为我无法控制它发生的时间间隔。据我了解,BF是按iOS计划而非在我选择的时候。不过谢谢你的建议。 – user685869
你可以做另一种方式,就像在Appdelegate中创建一个后台任务(UIBackgroundTaskIdentifier)一样。 – AshokPolu