2014-04-02 37 views
2

我目前正在寫一個需要互聯網連接(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; 
     } 
    } 

運行應用程序時,無論我是否實際連接到互聯網以及服務器軟件是否在運行,我總是會在終端中獲得「否」。

在此先感謝。

回答

2

這裏的主要問題是代碼中的拼寫錯誤;在中讀取hostReachability = [Reachability reachabilityForInternetConnection];行LoginViewController.m應該是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

我用這libarary使用塊,這樣其行的事不會凍結的應用程序,並在後臺

https://github.com/tonymillion/Reachability

+0

如果一個很好的答案,你可以PLZ接受嗎? –

+1

使用Apple的Reachability類並在後臺線程上調用它實際上是微不足道的。如果你不需要,爲什麼要導入第三方代碼? – smileBot

0

的作品,我認爲這個問題是在你的「主機名」。這不是您的服務器的IP,而是您的主機名,例如www.apple.com。您可以查看Apple的example code。在第87行,他們將主機名設置爲@"www.apple.com"

+0

但我應該檢查我的服務器是否可用,對不對?至少對我來說,將「主機名」實體指向我的服務器的IP地址是合理的。它仍然不能解釋爲什麼我在測試互聯網連接時得到「否」。 –