针对 URL 中的特定页面检查可访问性
Posted
技术标签:
【中文标题】针对 URL 中的特定页面检查可访问性【英文标题】:checking reachability against a specific page in a URL 【发布时间】:2012-03-08 11:25:49 【问题描述】:在我阅读了this question 的答案后,我发现使用reachabilityWithHostName
不适用于这样的URL:mySite.com/service.asmx
,是否可以使用reachabilityWithHostName
或检查该URL 的可达性任何reachability
类方法?
非常感谢。
【问题讨论】:
Reachability 仅用于检查您是否可以访问 Internet,以便确定是否应该提醒用户并因此使用缓存数据。这是 Apple 用户交互指南的一部分。如果您想检查特定的 URL,然后尝试访问它,将超时设置为非常小并捕获错误。 【参考方案1】:Reachability 类和-reachabilityWithHostname:
旨在成为一种快速、快速的机制,用于确定您是否具有与主机的基本网络连接。如果您需要验证是否可以下载特定 URL,则需要查看使用 NSURLConnection
检索 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];
如果您收到一个非零的 myData,那么您就有了某种连接。 response
和 error
将告诉您服务器对您的响应(在响应的情况下,如果您收到非零 myData)或发生了什么样的错误,在零 myData 的情况下。
对于不平凡的案例,你可以从苹果的Using NSURLConnection得到很好的指导。
如果您不想停止前台进程,您可以通过两种不同的方式执行此操作。上述文档将提供有关如何实现委托等的信息。但是,更简单的实现是使用 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];
);
);
【讨论】:
能否提供一个简单的例子来说明如何在后台执行以防止应用程序挂起? 我添加了一个示例,使用 GCD 在对后台线程的异步调用上发出同步请求,并在完成时将响应作为消息返回给主线程。希望对您有所帮助。 太棒了!上面的代码有一个小错误,你必须在第一个 if 语句中设置reachable = YES,在第二个 if 语句中设置为 NO。非常感谢你。 @brainray 感谢您的帮助编辑。注意:对于那些想知道为什么域示例从 MySite.com 更改为 example.com 的人,这是 Stack Overflow 的要求。【参考方案2】:如果你想检查 一个 URL 的可达性(通常使用的是一个主机名),只需使用 NSURLConnection 执行 HEAD 请求。
【讨论】:
【参考方案3】:斯威夫特 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")
)
【讨论】:
以上是关于针对 URL 中的特定页面检查可访问性的主要内容,如果未能解决你的问题,请参考以下文章
HTML - 图标和 apple-touch-icon 中的可访问性