iOS可达性指南

43

有没有人找到了一个相当不错的 iOS Reachability 实现指南?

3个回答

95

我已经按照如下方式实现了 Reachability。

下载 https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html 并将 Reachability.h 和 .m 添加到您的项目中。将 SystemConfiguration 框架添加到您的项目中。在您想使用它的地方添加 #import "Reachability.h"。使用以下代码。

-(BOOL)reachable {
    Reachability *r = [Reachability reachabilityWithHostName:@"enbr.co.cc"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];
    if(internetStatus == NotReachable) {
        return NO;
    }
    return YES;
}

当您想要检查可达性时...

if ([self reachable]) {
    NSLog(@"Reachable");
}
else {
    NSLog(@"Not Reachable");
}

这是我制作的示例项目。 http://dl.dropbox.com/u/3656129/ReachabilityExample.zip


你应该在applicationDidFinishLaunching中检查可达性吗? - Sheehan Alam
1
@AVeryDev - 通知功能来自于苹果自己的可达性示例。它可以跟踪互联网连接,并在设备切换连接时通知应用程序。如果您的应用程序对连接状态的更改感兴趣,请使用此功能。否则,以上内容显然要简单得多。 - n13
谢谢那段代码片段。有没有一种方法可以检查常规GSM连接? - seeafish
谢谢您。有时候在iOS世界里找到简单的做事方式是多么困难啊,这真是太神奇了。 - MusiGenesis
该代码最终会同步调用SCNetworkReachabilityGetFlags,这可能会阻塞长达30秒的时间来解析DNS名称。如果是这样,看门狗将会杀死你的应用程序。苹果明确建议不要在Reachability的ReadMe.txt文件中这样做。如果在主线程上调用此代码,将会很危险。这就是为什么你会在其他地方看到使用通知的原因。 - Jeremy
显示剩余3条评论

2

我认为检查主机地址可用性的最佳方法是通过检查NSURL请求的结果。

NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:reqURL]];
NSURLResponse *resp = nil;
NSError *error = nil;
NSData *response = [NSURLConnection sendSynchronousRequest: theRequest returningResponse: &resp error: &error];
NSString *responseString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];

使用这段代码,如果您的设备无法访问提供的URL,则会将一些输出提供给错误变量;如果可以访问URL请求,则错误为零。
即使您的URL数据包可以从设备路由出并且永远无法到达主机服务器,可达性仍会给出正面输出。

通常情况下,如果您只想检查资源是否可用,那么您只需要进行HEAD请求。如果您无论如何都要下载它,那么当然可以尝试下载它。 - hooleyhoop

0

这个问题似乎只有过时的答案。自从iOS 12以来,我们有了NWPathMonitor,所以你至少也应该研究一下它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接