在更新应用程序以支持后台应用程序刷新时,我遇到了AFNetworking问题。
我得到NSPOSIXErrorDomain Code=53 "Software caused connection abort"
。该问题似乎发生在iOS 12中,其中的后台连接已终止。
AFNetworking 2.6.3用于进行提取。
AppDelegate.m
:
- (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[OrdersService performFetch];
completionHandler(UIBackgroundFetchResultNewData);
}
OrdersService.m
:
-(void) performFetch {
[[AFHTTPRequestOperationManager new] GET:@"https://www.example.com/orders"
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}
];
}
控制台输出:
[错误] GET'(空)'(0)[31.9163 s]:错误域= NSPOSIXErrorDomain 代码= 53“软件导致连接中止” UserInfo = {NSErrorFailingURLStringKey = https://www.example.com/orders, _kCFStreamErrorDomainKey = 1,NSErrorPeerAddressKey = {长度= 16,容量= 16,字节= 0x100201bb3e80187c0000000000000000},_ kCFStreamErrorCodeKey = 53, NSErrorFailingURLKey = https://www.example.com/orders}
答案 0 :(得分:4)
以0.1秒的延迟启动作为后台抓取任务解决了该问题:
-(void) performFetch {
__block UIBackgroundTaskIdentifier bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithName:@"GET /orders" expirationHandler:^{
// EXPIRED
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// Start the long-running task and return immediately.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Do the work associated with the task, preferably in chunks.
[[AFHTTPRequestOperationManager new] GET:@"https://www.example.com/orders"
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// SUCCESS
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// FAILURE
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
];
});
}
答案 1 :(得分:2)
下面链接的某些解决方案有助于解决Lower protocol stack error: 53
。
AFNetworking GitHub上的信息性线程,其中包含相关详细信息和背景信息:AFNetworking issue
请阅读结尾处的评论以获取有见地的详细信息:
就变通办法而言,您可以在此处执行三件事,根据实际应用程序的要求,全部或三个子集都可能有意义。发挥作用:
A。如果您定期跳入和跳出应用程序(例如,将用户跳出Safari,以便他们可以执行某些身份验证任务,然后希望Safari将用户跳回应用程序),则可以使用UIApplication后台任务,以防止您的应用在这些反弹期间被暂停。
这种方法只会让您的应用运行几分钟,但是如果这足以满足普通用户的情况,那就值得这样做。
B。您可以自己重试请求。即使您没有遇到这个问题,这通常也是个好主意。瞬态问题很多,可能导致请求失败,而一次重试通常会使您越过该错误,而无需进行进一步的补救工作。
这里明显的陷阱是幂等。您可以毫无疑问地重试幂等请求,但是如果您想重试非幂等请求,则需要一些特定于应用程序的狡猾逻辑。
C。您可以在进入后台时使会话无效,然后在回到前台时重新创建会话。新会话不会与旧会话共享任何连接,因此不会发生此问题。
正如我之前提到的,组合方法可能很有意义。例如,A和C可以很好地协同工作,除非您用完了后台执行时间,否则可以避免会话无效的代价。您可能要执行B,因为它在此问题空间之外有很多好处。
就我而言,它是在iOS12.3
设备上发生的
2019-08-05 17:38:50.988880-0700 myApp[2988:1589883] [BoringSSL] nw_protocol_boringssl_error(1584) [C15.1:4][0x10dd6e700] Lower protocol stack error: 53
2019-08-05 17:38:50.990132-0700 myApp[2988:1589883] TIC Read Status [15:0x281d59d40]: 1:53
2019-08-05 17:38:50.995585-0700 myApp[2988:1589883] Task <D62956CC-6C2B-4D5E-B1DA-0A5CA2BB60EF>.<1> HTTP load failed (error code: 53 [1:53])
2019-08-05 17:38:51.000334-0700 myApp[2988:1588479] Task <D62956CC-6C2B-4D5E-B1DA-0A5CA2BB60EF>.<1> finished with error - code: 53
准备将应用程序在后台模式下运行:Apple's doc: How to do background fetch
此外,有关后台任务的良好信息来源:apple dev forum