Ios 检查URL中特定页面的可达性

Ios 检查URL中特定页面的可达性,ios,objective-c,swift,iphone,reachability,Ios,Objective C,Swift,Iphone,Reachability,在我阅读了的答案之后,我发现使用reachabilitywhithhostname与这样的URL不兼容:mySite.com/service.asmx,是否仍然可以使用reachabilitywhithhostname或任何reachability类方法检查此URL的可访问性 非常感谢。如果您想根据URL检查可访问性(通常用于主机名),只需使用NSURLConnection执行HEAD请求。可访问性类和-reaccabilityWithHostName:设计为快速,fail fast机制,用于确

在我阅读了的答案之后,我发现使用
reachabilitywhithhostname
与这样的URL不兼容:
mySite.com/service.asmx
,是否仍然可以使用
reachabilitywhithhostname
或任何
reachability
类方法检查此URL的可访问性


非常感谢。

如果您想根据URL检查可访问性(通常用于主机名),只需使用NSURLConnection执行HEAD请求。

可访问性类和
-reaccabilityWithHostName:
设计为快速,fail fast机制,用于确定您是否具有与主机的基本网络连接。如果需要验证某个特定URL是否可以下载,则需要查看使用
NSURLConnection
检索URL的内容,以验证该URL是否确实可用

根据需要在前台还是后台执行此操作,您可以使用简单但分块的:

+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
或者,您可以使用更复杂的方法创建NSURLConnection对象,设置委托以接收响应并等待这些响应

对于简单的情况:

 NSURL *myURL = [NSURL URLWithString: @"http://example.com/service.asmx"];
 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL];
 [request setHTTPMethod: @"HEAD"];
 NSURLResponse *response;
 NSError *error;
 NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];
如果你收到一个非nil myData,你就有了某种连接
response
error
将告诉您服务器对您的响应(在响应的情况下,如果您收到非nil myData),或者在nil myData的情况下发生了什么类型的错误

对于一个非常重要的例子,你可以从苹果的网站上得到很好的指导

如果你不想暂停前台进程,你可以用两种不同的方法。上面的文档将提供有关如何实现委托等的信息。但是,更简单的实现是使用GCD在后台线程上发送同步请求,然后在完成后在主线程上发送消息

大概是这样的:

 NSURL *myURL = [NSURL URLWithString: @"http://example.com/service.asmx"];
 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: myURL];
 [request setHTTPMethod: @"HEAD"];
 dispatch_async( dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_BACKGROUND, NULL), ^{
      NSURLResponse *response;
      NSError *error;
      NSData *myData = [NSURLConnection sendSynchronousRequest: request returningResponse: &response error: &error];
      BOOL reachable;

      if (myData) {
            // we are probably reachable, check the response
            reachable=YES;
      } else {
            // we are probably not reachable, check the error:
            reachable=NO;
      }

      // now call ourselves back on the main thread
      dispatch_async( dispatch_get_main_queue(), ^{
            [self setReachability: reachable];
      });
 });
斯威夫特5 Swift的一个可能解决方案是:

 func verifyURL(urlPath: String, completion: @escaping (_ isValid: Bool) ->()) {
    if let url = URL(string: urlPath) {
        var request = URLRequest(url: url)
        request.httpMethod = "HEAD"
        let task = URLSession.shared.dataTask(with: request) { _, response, error in
            if let httpResponse = response {
                if httpResponse.getStatusCode() == 200 {
                completion(true)
                }
            } else {
                completion(false)
            }
        }
        task.resume()
    } else {
        completion(false)
    }
}
然后调用如下方法:

verifyURL(urlPath: "www.google.com", completion: { (isValid) in
    if isValid {
        runYourCode()
    } else {
        print("URL: www.google.com is not reachable")
    }
})

可访问性仅用于检查您是否具有internet访问权限,以便确定是否应提醒用户并因此使用缓存数据。这是苹果用户交互指南的一部分。如果要检查特定URL,请尝试访问它,将超时设置为非常小并捕获错误。能否提供一个简单示例,说明如何在后台执行此操作以防止应用程序挂起?我添加了一个使用GCD在对后台线程的异步调用上发出同步请求的示例,完成后,将响应作为消息返回主线程。希望有帮助。太棒了!上面的代码中有一个小错误,您必须在第一个if语句中设置reachable=YES,在第二个if语句中设置为NO。非常感谢你,盖奇。@brainray感谢你的帮助编辑。注意:对于那些想知道为什么域示例从MySite.com更改为example.com的人来说,这是堆栈溢出的一个要求。