我是iOS开发的新手,我正在开发一个Swift 3/ iOS 10应用程序,它收集全球定位系统的位置数据,并在地图上显示用户的位置。该应用程序还通过HTTP将位置数据发送到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)在领域数据库中持久化作业,2)以FIFO顺序执行作业。
到目前为止,这似乎如预期的那样起作用。然而,我注意到当用户按下home按钮,我的应用程序被发送到后台/被挂起时,我继续得到位置更新,但是我的HTTP似乎最终停止工作。
我使用Alamofire 4.0.1来制作HTTP。我已经将登录添加到代码中,并且每次都会调用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继续正常工作(我可以看到服务器上接收到的位置数据)。但是,最终,我不再看到服务器上的数据是POSTed,并且没有看到Alamofire响应JSON处理程序执行的任何代码。在我的应用程序日志中,我始终看到字符串"About to POST location data...",但最终"Inside response JSON handler!"消息不再出现。
正如我所说的,我对iOS相当陌生,所以我可能缺少一些关于操作系统如何处理后台操作的基本内容。这种行为是否表明iOS允许我的应用程序在后台正常工作一段时间,然后阻止它最终进行网络呼叫?如果是的话,在应用程序处于后台时,是否有另一种方法可以可靠地在特定的时间间隔内执行重复的HTTP?
发布于 2016-10-26 14:27:16
转到'Capabilities‘下的目标设置的应用程序,启用背景模式,并检查标记的背景获取。试一次,希望它对你有用。
https://stackoverflow.com/questions/40264748
复制相似问题