【问题标题】:Reachability not working可达性不起作用
【发布时间】:2014-04-02 11:51:28
【问题描述】:

我目前正在编写一个需要互联网连接(TCP 到服务器)的游戏。我正在尝试使用 Apple 的 Reachability 类,但它不起作用。我是 NotificationCenter 和 Reachability 的新手,所以如果这是一个愚蠢的问题,请原谅。

LoginViewController.h 中与可达性相关的道具

@property (nonatomic) Reachability *hostReachability;
@property (nonatomic) Reachability *internetReachability;
@property (nonatomic) Reachability *wifiReachability;
@property BOOL internetActive;
@property BOOL hostActive;

在 LoginViewController.m 中

//Reachability
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleNetworkChange:) name: kReachabilityChangedNotification object: nil];

    NSString* hostIP = @"<my server IP is here, removed for obvious reasons>";

    hostReachability = [Reachability reachabilityWithHostname:hostIP];

    [hostReachability startNotifier];

    NetworkStatus hostStatus = [internetReachability currentReachabilityStatus];

    if(hostStatus == NotReachable) {NSLog(@"no");}
    else if (hostStatus == ReachableViaWiFi) {NSLog(@"wifi"); }
    else if (hostStatus == ReachableViaWWAN) {NSLog(@"cell"); }

    hostReachability = [Reachability reachabilityForInternetConnection];

    [internetReachability startNotifier];

    NetworkStatus internetStatus = [internetReachability currentReachabilityStatus];

    if(internetStatus == NotReachable) {NSLog(@"no");}
    else if (internetStatus == ReachableViaWiFi) {NSLog(@"wifi"); }
    else if (internetStatus == ReachableViaWWAN) {NSLog(@"cell"); }

handleNetworkChange:过程

- (void)handleNetworkChange:(NSNotification*)notification{
    NetworkStatus internetStatus = [internetReachability currentReachabilityStatus];

    switch (internetStatus) {
        case NotReachable:
        {
            NSLog(@"No internet connection");
            self.internetActive = NO;
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No internet connection"
                                                            message:@"Could not connect to the internet. Please try again later."
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
            [alert show];
        }
        break;
        case ReachableViaWiFi:
        {
            NSLog(@"The internet is working via WIFI.IN AGENDA");
            self.internetActive = YES;

            break;
        }
        case ReachableViaWWAN:
        {
            NSLog(@"The internet is working via WWAN.IN AGENDA");
            self.internetActive = YES;

            break;
        }

        default:
        break;
    }

    NetworkStatus hostStatus = [hostReachability currentReachabilityStatus];
    switch (hostStatus)
    {
        case NotReachable:
        {
            NSLog(@"A gateway to the host server is down.IN AGENDA");
            self.hostActive = NO;
            NSLog(@"No internet connection");
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No connection to host"
                                                            message:@"Could not connect to the host server. Please try again later."
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
            [alert show];

            break;
        }
        case ReachableViaWiFi:
        {
            NSLog(@"A gateway to the host server is working via WIFI.IN AGENDA");
            self.hostActive = YES;

            break;
        }
        case ReachableViaWWAN:
        {
            NSLog(@"A gateway to the host server is working via WWAN.IN AGENDA");
            self.hostActive = YES;

            break;
        }
    }

运行应用程序时,无论我是否实际连接到互联网,以及服务器软件是否正在运行,我总是在终端中收到“no no”。

提前致谢。

【问题讨论】:

    标签: ios networking reachability server-communication


    【解决方案1】:

    这里的主要问题是您的代码中的拼写错误; LoginViewController.mhostReachability = [Reachability reachabilityForInternetConnection]; 的行应该是internetReachability = [Reachability reachabilityForInternetConnection];。目前的情况是,您永远不会实例化internetReachability,然后我猜[internetReachability currentReachabilityStatus] 将始终返回nil

    以下是您可以使用的基本示例:

    @interface LoginViewController ()
    
    // ...
    
    @property (strong, nonatomic) Reachability *hostReachability;
    @property (strong, nonatomic) Reachability *internetReachability;
    @property (strong, nonatomic) Reachability *wifiReachability;
    
    @end
    
    @implementation LoginViewController
    
    // ...
    
    - (void)setupReachabilityMonitoring
    {
        [NSNotificationCenter.defaultCenter addObserver:self
                                               selector:@selector(reachabilityChanged:)
                                                   name:kReachabilityChangedNotification
                                                 object:nil];
    
        _hostReachability = [Reachability reachabilityWithHostName:@"8.8.8.8"];
        [_hostReachability startNotifier];
    
        _internetReachability = [Reachability reachabilityForInternetConnection];
        [_internetReachability startNotifier];
    
        _wifiReachability = [Reachability reachabilityForLocalWiFi];
        [_wifiReachability startNotifier];
    
        [self logReachabilityStatus];
    }
    
    - (void)reachabilityChanged:(NSNotification *)notification
    {
        if ([notification.object isKindOfClass:Reachability.class]) {
            [self logReachabilityStatus];
        }
    }
    
    - (void)logReachabilityStatus
    {
        NSString *hostStatus = _hostReachability.currentReachabilityStatus ? @"up" : @"down";
        NSString *internetStatus = _internetReachability.currentReachabilityStatus ? @"up" : @"down";
        NSString *wifiStatus = _wifiReachability.currentReachabilityStatus ? @"up" : @"down";
    
        NSLog(@"Internet is %@, wifi is %@, host is %@", internetStatus, wifiStatus, hostStatus);
    }
    
    @end
    

    【讨论】:

      【解决方案2】:

      我正在使用这个库使用块,所以它不会冻结应用程序并在后台运行

      https://github.com/tonymillion/Reachability

      【讨论】:

      • 使用 Apple 的 Reachability 类并在后台线程上调用它实际上很简单。如果不需要,为什么要导入第三方代码?
      【解决方案3】:

      我认为问题出在您的“主机名”上。这不是您服务器的 IP,而是您的主机名,例如 www.apple.com。您可以查看 Apple 的example code。在第 87 行,他们将主机名设置为 @"www.apple.com"

      【讨论】:

      • 但是我应该检查我的服务器是否可用,对吗?至少对我来说,将“主机名”实体指向我的服务器的 IP 地址是有意义的。它仍然无法解释为什么我在测试互联网连接时得到“否”。
      猜你喜欢
      • 2011-06-27
      • 1970-01-01
      • 2023-03-05
      • 2017-07-01
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      相关资源
      最近更新 更多