斯威夫特|后台线程中的网络调用立即超时

问题描述

每当应用程序收到新的无提示通知时,我都会配置一个本地网络调用,它会触发 setAction(),这是一个 POST 请求,将与刚刚收到的通知相关的信息发送到我们自己的服务器,在前台,网络调用作为预期,只有当应用程序在后台时才会出现问题。我 100% 确定 setAction 正在被调用,但是看起来它在启动 dataTask 时很快就会使网络调用超时,我尝试使用线程,但我不确定问题就在这里。

注意事项:

  • 为了确保这不是网络问题,我还尝试了其他 HTTP 请求调用配置

  • 如果我快速发送 2 个无声通知,它会触发 1 个 setAction()

      func application(_ application: UIApplication,didReceiveRemoteNotification         userInfo: [AnyHashable: Any],fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    
      // Network call
      tellMe.setAction()
    
      completionHandler(UIBackgroundFetchResult.newData)
    

    }

我已经能够检索到的一些“日志”(出于例如目的而隐藏了真实的 https URL)。

Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=-2103,_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <92F80B2F-3D6A-4089-AC76-D160B584712C>.<1>,_NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <92F80B2F-3D6A-4089-AC76-D160B584712C>.<1>"
),NSLocalizedDescription=The request timed out.,NSErrorFailingURLStringKey=https://actualURL.com,NSErrorFailingURLKey=https://actualURL.com,_kCFStreamErrorDomainKey=4}
The request timed out.

先谢谢大家,

解决方法

问题是在 http 请求甚至有时间被调用之前,completionHandler 就被调用了。解决方法是增加更多时间,如下(不是最漂亮的实现,但它有效),

func application(_ application: UIApplication,didReceiveRemoteNotification userInfo: [AnyHashable: Any],fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        
        // Network call
        tellMe.setAction()
        
        let state = UIApplication.shared.applicationState
        if state == .background {
            //print("App in Background")
            DispatchQueue.main.asyncAfter(deadline: .now() + 29) {
                completionHandler(UIBackgroundFetchResult.newData)
            }
        } else {
            //print("App in Foreground or Active")
            completionHandler(UIBackgroundFetchResult.newData)
        }
    }

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...