我想检查一下我是否可以在iOS上使用Cocoa Touch库或在macOS上使用Cocoa库连接互联网。

我想出了一个方法来做这个使用NSURL。我的方法似乎有点不可靠(因为即使谷歌也可能有一天宕机,依赖第三方似乎很糟糕),虽然如果谷歌没有响应,我可以检查其他一些网站的响应,但这似乎是浪费和不必要的应用程序开销。

- (BOOL)connectedToInternet {
    NSString *URLString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com"]];
    return ( URLString != NULL ) ? YES : NO;
}

是我做得不好,(更不用说stringWithContentsOfURL已弃用在iOS 3.0和macOS 10.4),如果是这样,有什么更好的方法来实现这一点?


当前回答

下载Reachability文件,https://gist.github.com/darkseed/1182373 在framework中添加CFNetwork.framework和'SystemConfiguration.framework' 导入“Reachability.h”

首先:在framework中添加CFNetwork.framework

代码:ViewController.m

- (void)viewWillAppear:(BOOL)animated
{
    Reachability *r = [Reachability reachabilityWithHostName:@"www.google.com"];
    NetworkStatus internetStatus = [r currentReachabilityStatus];

    if ((internetStatus != ReachableViaWiFi) && (internetStatus != ReachableViaWWAN))
    {
        /// Create an alert if connection doesn't work
        UIAlertView *myAlert = [[UIAlertView alloc]initWithTitle:@"No Internet Connection"   message:NSLocalizedString(@"InternetMessage", nil)delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [myAlert show];
        [myAlert release];
    }
    else
    {
         NSLog(@"INTERNET IS CONNECT");
    }
}

其他回答

重要:该检查应该始终异步执行。下面的大多数答案是同步的,所以要小心,否则你会冻结你的应用程序。


斯威夫特

通过CocoaPods或Carthage安装:https://github.com/ashleymills/Reachability.swift 通过闭包测试可达性 let reachability =可达性()! 可达性。whenReachable ={可达性 如果可达性。连接== .wifi { 打印(“可通过WiFi访问”) }其他{ 打印(“可通过蜂窝连接”) } } 可达性。whenUnreachable = {_ in 打印(“不可以”) } {做 尝试reachability.startNotifier () } catch { 打印("无法启动通知程序") }


objective - c

将SystemConfiguration框架添加到项目中,但不要担心将它包含在任何地方 添加Tony Million版本的Reachability.h和Reachability。m到项目(在这里找到:https://github.com/tonymillion/Reachability) 更新接口部分 #进口“Reachability.h” //在视图控制器的.m文件中添加这个接口 @interface MyViewController () { 可达性* internetReachableFoo; } @end 然后在视图控制器的。m文件中实现这个方法,你可以调用它 //检查我们是否有网络连接 - (void) testInternetConnection { internetReachableFoo = [Reachability reachabilityWithHostname:@"www.google.com"]; //网络可达 internetReachableFoo。reachableBlock = ^(可达性*reach) { //更新主线程的UI 设置(dispatch_get_main_queue()、^ { NSLog(@“Yayyy,我们有了互联网!”); }); }; //网络不可达 internetReachableFoo。unreachableBlock = ^(可达性*reach) { //更新主线程的UI 设置(dispatch_get_main_queue()、^ { NSLog(@"有人破坏了互联网:("); }); }; [internetReachableFoo startNotifier]; }

重要提示:Reachability类是项目中最常用的类之一,因此您可能会遇到与其他项目的命名冲突。如果发生这种情况,您将不得不重命名Reachability.h和Reachability对中的一个。M文件到其他文件来解决这个问题。

注意:您使用的域名并不重要。这只是在测试通往任何领域的入口。

以下是我在我的应用程序中是如何做到的:虽然200状态响应代码不能保证任何东西,但对我来说已经足够稳定了。这并不需要像NSData回答一样多的加载,因为我的只是检查HEAD响应。

银行的国际代码

func checkInternet(flag:Bool, completionHandler:(internet:Bool) -> Void)
{
    UIApplication.sharedApplication().networkActivityIndicatorVisible = true

    let url = NSURL(string: "http://www.google.com/")
    let request = NSMutableURLRequest(URL: url!)

    request.HTTPMethod = "HEAD"
    request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData
    request.timeoutInterval = 10.0

    NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.mainQueue(), completionHandler:
    {(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in

        UIApplication.sharedApplication().networkActivityIndicatorVisible = false

        let rsp = response as! NSHTTPURLResponse?

        completionHandler(internet:rsp?.statusCode == 200)
    })
}

func yourMethod()
{
    self.checkInternet(false, completionHandler:
    {(internet:Bool) -> Void in

        if (internet)
        {
            // "Internet" aka Google URL reachable
        }
        else
        {
            // No "Internet" aka Google URL un-reachable
        }
    })
}

objective - c代码

typedef void(^connection)(BOOL);

- (void)checkInternet:(connection)block
{
    NSURL *url = [NSURL URLWithString:@"http://www.google.com/"];
    NSMutableURLRequest *headRequest = [NSMutableURLRequest requestWithURL:url];
    headRequest.HTTPMethod = @"HEAD";

    NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    defaultConfigObject.timeoutIntervalForResource = 10.0;
    defaultConfigObject.requestCachePolicy = NSURLRequestReloadIgnoringLocalAndRemoteCacheData;

    NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue: [NSOperationQueue mainQueue]];

    NSURLSessionDataTask *dataTask = [defaultSession dataTaskWithRequest:headRequest
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    {
        if (!error && response)
        {
            block([(NSHTTPURLResponse *)response statusCode] == 200);
        }
    }];
    [dataTask resume];
}

- (void)yourMethod
{
    [self checkInternet:^(BOOL internet)
    {
         if (internet)
         {
             // "Internet" aka Google URL reachable
         }
         else
         {
             // No "Internet" aka Google URL un-reachable
         }
    }];
}

步骤1:在项目中添加Reachability类。 步骤2:导入Reachability类 步骤3:创建下面的函数 - (BOOL)checkNetConnection { self.internetReachability =[可达性reachabilityForInternetConnection]; [self.internetReachability startNotifier]; NetworkStatus netStatus = [self.internetReachability currentReachabilityStatus]; switch (netStatus) { 案例NotReachable: { 返回NO; } 案例ReachableViaWWAN: { 返回YES; } 案例ReachableViaWiFi: { 返回YES; } } } 步骤4:调用函数如下所示: 如果(![self checkNetConnection]) { [GlobalFunctions showAlert: @”“ 信息:@“请连接到互联网!” canBtntitle:零 otherBtnTitle: @“Ok”); 返回; } 其他的 { 日志。V(“internet is connected”,“ok”); }

迅捷5号,我是阿拉莫火,主持人

// Session reference
var alamofireSessionManager: Session!

func checkHostReachable(completionHandler: @escaping (_ isReachable:Bool) -> Void) {
    let configuration = URLSessionConfiguration.default
    configuration.timeoutIntervalForRequest = 1
    configuration.timeoutIntervalForResource = 1
    configuration.requestCachePolicy = .reloadIgnoringLocalCacheData

    alamofireSessionManager = Session(configuration: configuration)

    alamofireSessionManager.request("https://google.com").response { response in
        completionHandler(response.response?.statusCode == 200)
    }
}

// Using
checkHostReachable() { (isReachable) in
    print("isReachable:\(isReachable)")
}

Reachability类可以确定一个设备的互联网连接是否可用…

但在访问内网资源时:

使用可达性类ping内网服务器总是返回true。

因此,在这种情况下,一个快速的解决方案是创建一个名为pingme的web方法以及服务上的其他web方法。 pingme应该返回一些东西。

所以我写了下面关于普通函数的方法

-(BOOL)PingServiceServer
{
    NSURL *url=[NSURL URLWithString:@"http://www.serveraddress/service.asmx/Ping"];

    NSMutableURLRequest *urlReq=[NSMutableURLRequest requestWithURL:url];

    [urlReq setTimeoutInterval:10];

    NSURLResponse *response;

    NSError *error = nil;

    NSData *receivedData = [NSURLConnection sendSynchronousRequest:urlReq
                                                 returningResponse:&response
                                                             error:&error];
    NSLog(@"receivedData:%@",receivedData);

    if (receivedData !=nil)
    {
        return YES;
    }
    else
    {
        NSLog(@"Data is null");
        return NO;
    }
}

上面的方法对我来说非常有用,所以每当我试图向服务器发送一些数据时,我总是使用这个低超时URLRequest检查我的内部网资源的可达性。