我对iOS开发相对较新,我正在开发一个收集GPS位置数据并在地图上显示用户位置的Swift 3 / iOS 10应用程序。该应用程序还通过HTTP POST将位置数据发送到Web服务器。数据传输在用户可配置的时间间隔内发生,范围从每分钟一次到每小时一次。简而言之,这基本上就是我正在做的事情:
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)在Realm数据库中保存作业,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继续正常工作(我可以看到服务器上收到的位置数据) 。但是,最终,我停止看到数据被POST到服务器,我没有看到Alamofire响应JSON处理程序中的任何代码执行。在我的应用日志中,我始终看到字符串"About to POST location data..."
,但最终"Inside response JSON handler!"
消息停止显示。
正如我所说,我对iOS很新,所以我可能会遗漏一些关于操作系统如何处理后台操作的基本知识。这种行为是否表明iOS允许我的应用程序在后台运行一段时间,但最终阻止它进行网络呼叫?如果是这样,还有另一种方法可以在应用程序处于后台时以特定间隔可靠地执行重复发送的HTTP POST吗?
答案 0 :(得分:0)
转到' 能力'在应用程序的目标设置下,启用背景模式并选中后台提取。尝试一次,可能适合你。