iOS 10 在应用程序处于后台时进行 HTTP POST

Posted

技术标签:

【中文标题】iOS 10 在应用程序处于后台时进行 HTTP POST【英文标题】:iOS 10 making HTTP POST when app is in background 【发布时间】:2016-10-26 14:18:03 【问题描述】:

我对 ios 开发比较陌生,我正在开发一个 Swift 3 / iOS 10 应用程序,该应用程序收集 GPS 位置数据并在地图上显示用户的位置。该应用程序还通过 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 继续正常工作(我可以看到服务器上接收到的位置数据) .但是,最终,我不再看到将数据发布到服务器,并且我没有看到 Alamofire 响应 JSON 处理程序中的任何代码执行。在我的应用日志中,我一直看到字符串 "About to POST location data...",但最终 "Inside response JSON handler!" 消息停止出现。

正如我所说,我对 iOS 还很陌生,所以我可能会遗漏一些关于操作系统如何处理后台操作的基本知识。这种行为是否表明 iOS 允许我的应用程序在后台正常工作一段时间,但最终阻止它进行网络调用?如果是这样,是否有另一种方法可以在应用处于后台时以特定时间间隔可靠地执行重复的 HTTP POST?

【问题讨论】:

【参考方案1】:

转到应用程序目标设置下的“Capabilities”,启用背景模式并选中Background fetch。试一次,可能对你有用。

【讨论】:

不幸的是,后台提取对我来说不是一个好的解决方案,因为我无法控制它发生的时间间隔。据我了解,BF 是由 iOS 机会性地安排的,而不是在我选择的时间。不过,谢谢你的建议。 你可以做另外一种方式,比如在 Appdelegate 中创建一个后台任务(UIBackgroundTaskIdentifier)。

以上是关于iOS 10 在应用程序处于后台时进行 HTTP POST的主要内容,如果未能解决你的问题,请参考以下文章

IOS - 从UNNotificationAction触发后,当应用程序处于后台时发送http请求

当应用程序在iOS swift 3中处于后台模式时如何每10秒获取一次纬度和经度

iOS:在应用程序处于后台时执行上传任务

iOS 10:如何在应用程序处于后台时显示传入的 VOIP 呼叫通知?

iOS - 如何在应用程序处于后台时检测网络变化

当应用程序在 iOS 11.4.1 中处于后台时,静默通知不起作用