sendAsynchronousRequest:queue:completionHandler:应用程序在后台时失败

Posted

技术标签:

【中文标题】sendAsynchronousRequest:queue:completionHandler:应用程序在后台时失败【英文标题】:sendAsynchronousRequest:queue:completionHandler: fails while app is in background 【发布时间】:2015-05-27 07:06:41 【问题描述】:

我正在使用NSURLConnection 进行互联网可用性检查,但它未能调用成功或错误块:

- (void)isNetworkAvailableWithCallBack:(SuccessCallback)successBlock onFailure:(FailureCallback)failureBlock   
        NSURL *URL = [NSURL URLWithString:@"http://www.google.com/"];
        NSURLRequest *request = [NSURLRequest requestWithURL:URL];
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue new] completionHandler:^(NSURLResponse *response, NSData __unused *data, NSError *error)
            if (response != nil)
                NSLog(@"Connected");
                dispatch_async(dispatch_get_main_queue(), ^
                    successBlock(YES);
                );
             else 
                dispatch_async(dispatch_get_main_queue(), ^
                    failureBlock(YES);
                );
                NSLog(@"Not Connected");
                [self presentError:error];

            
        ];
    

当应用程序处于前台或首次加载时,应用程序运行良好。当然,我的后台多任务处理已启用。当发生以下情况时,问题就开始了:

将应用程序发送到 BG。 等一会... 该应用程序被 ios 杀死。

当我的应用再次从后台转到前台时,会使用以下状态代码调用块:

Code=-1001

这是一个请求超时错误。但是为什么我的应用程序进入后台时不调用它(不是每次都发生,它工作正常)。

我的代码有什么问题吗?我该如何处理?

【问题讨论】:

【参考方案1】:

您需要在 Capabilities 中启用“项目后台模式”。

请参考附件截图

【讨论】:

以上是关于sendAsynchronousRequest:queue:completionHandler:应用程序在后台时失败的主要内容,如果未能解决你的问题,请参考以下文章

返回方法中的 sendAsynchronousRequest 和 completionHandler

sendAsynchronousRequest 使 UI 冻结

sendAsynchronousRequest 在 iOS 9 中已弃用,如何更改代码以修复

NSURL Connection sendAsynchronousRequest 如何保存响应?

ios:NSURLConnection sendAsynchronousRequest 为啥不起作用?

NSURLConnection sendAsynchronousRequest 在某些刷新请求上没有命中完成处理程序