问题描述
每当应用程序收到新的无提示通知时,我都会配置一个本地网络调用,它会触发 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)
}
}