如何解决斯威夫特|后台线程中的网络调用立即超时
每当应用程序收到新的无提示通知时,我都会配置一个本地网络调用,它会触发 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)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。