问题描述
先前的代码
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:NULL]; 返回([response statusCode] == 200)?是:否;
立即使用代码
+(BOOL)isConnectNetwork {
Nsstring *urlString = @"http://www.google.com/";
NSURL *url = [NSURL URLWithString:urlString];
NSMutableuRLRequest *request = [NSMutableuRLRequest requestWithURL:url];
[request setHTTPMethod:@"HEAD"];
NSHTTPURLResponse *response;
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:
^(NSData *data,NSURLResponse *response,NSError *error) {
// ...
}];
[task resume];
}
我收到此错误
2020-11-06 13:07:36.125607 + 0000 App [8518:1786305] [NetworkInfo]信号强度查询返回错误:错误Domain = NSPOSIXErrorDomain代码= 13“权限被拒绝”,描述符:
解决方法
不建议进行这种网络检查,因为它容易出错。通常最好假设网络正在运行直到 real 网络请求(您实际上在乎的事情)失败,然后适当地处理该失败(错误消息,背景颜色更改,等等)
不这样做的原因是,在移动设备上,网络可以工作一秒钟,而在一秒钟后不能工作。因此,像这样进行不必要的网络检查不会带来任何好处,但有可能使您的应用程序无法使用(特别是如果您限制了该检查背后的任何功能,则再次不建议这样做)。
我的建议是完全删除此方法,并假装它始终返回YES。从长远来看,您会更满意这种方法。错误发生时进行处理。不要试图找出它们。
也就是说,如果出于某种原因必须执行此操作,那么您将面临的问题是NSURLSession任务是异步的,但是您尝试同步使用它。因此,要使其正常工作,您需要
- 使用dispatch_async块将所有这些代码包装到另一个调度队列中。
- 在该块之外,阻塞该方法正在运行的线程,以使该方法不会返回。通常,您可以通过等待信号量来做到这一点。
- 在完成块内部,根据请求是成功完成还是失败来设置__block BOOL变量的值,然后将其发布到信号量以使外部代码停止等待。
但是,再次不鼓励这样做。在没有其他方法(涉及我无法控制的混乱代码)的地方,我已经将其作为解决方法,但是除非没有其他方法,否则请不要这样做。 :-)