2012-07-01 2 views
16

Скачана достижимость от Apple, используя этот метод, чтобы проверить наличие активного подключения:достижимость не работают, как ожидалось

-(BOOL)isReachable{ 

    Reachability *r = [Reachability reachabilityWithHostName:@"http://www.google.com"]; 

    if(NotReachable == [r currentReachabilityStatus]) { 
     NSLog(@"Not Reachable"); 
     return NO; 
    } 

    NSLog(@"Reachable"); 
    return YES; 

} 

не возвращает каждый раз, несмотря на то связаны? Не могу понять, почему ...

Любые идеи? Благодарю.

На стороне примечания, может ли кто-нибудь порекомендовать хороший чистый класс одноэлементности достижимости?

ответ

30

Редакция: вы должны удалить протокол, http от вашего reachabilityWithHostName аукнется, так и обновлен его

Reachability *reachability = [Reachability reachabilityWithHostname:@"www.google.com"]; 
NetworkStatus netStatus = [reachability currentReachabilityStatus]; 
+1

Yeh Я уже сделал это и быть_наст биты уведомления рабочих штрафа. Я хочу, чтобы метод, проверяющий состояние достижимости, прежде чем выполнять определенные задачи (например, загружать продукты для покупок в приложении) –

+0

@AdamWaite извините, я сделал ошибку раньше, я обновил вопрос –

+0

Отлично, это сделало трюк. Благодарю. –

1

Я использую KSReachability. Он работает с NSNotification, блоками, KVO и с ARC или без него.

KSReachability *reachability = [KSReachability reachabilityToHost:@"www.google.com"]; 
reachability.onReachabilityChanged = ^(KSReachability* reachability) { 
    NSLog(@"Update: network is %@", reachability.reachable ? @"up." : @"down."); 
}; 
1

Если вы пытаетесь увидеть, если устройство может достигнуть интернет в целом, вы, вероятно, следует использовать reachabilityForInternetConnection вместо reachabilityWithHostName :. Кроме того, для обоих этих вызовов потребуется немного времени для запуска (оно все равно будет в миллисекундах, но дольше времени, необходимого для достижения условия if на следующей строке.) Ниже приведен пример одноэлементного класса, который использует достижимость.

static NetworkManager* sharedInstance = nil; 

@interface NetworkManager() 
@property (nonatomic, strong) Reachability* reachability; 
@end 

@implementation NetworkManager 
@synthesize reachability; 

+ (NetworkManager*)sharedInstance 
{ 
    @synchronized(self) { 
     if (sharedInstance == nil) { 
      sharedInstance = [[NetworkManager alloc] init]; 
     } 
    } 
    return sharedInstance; 
} 

- (id)init 
{ 
    reachability = [WYReachability reachabilityForInternetConnection]; 
} 

- (BOOL)isNetworkReachable 
{ 
    return ([self.reachability currentReachabilityStatus] != NotReachable); 
} 
@end 

Чтобы проверить доступность сети в других классах, вы можете использовать.

[[NetworkManager sharedInstance] isNetworkReachable]; 
5

Используйте этот код, чтобы проверить, является ли устройство, подключенное к Интернету или нет

использовать этот код в viewDidLoad:

Reachability* internetReachable; = [Reachability reachabilityForInternetConnection]; 
    [internetReachable startNotifier]; 

    hostReachable = [Reachability reachabilityWithHostName: @"www.apple.com"] ; 
    [hostReachable startNotifier]; 

и добавить эту функцию в код:

-(void) checkNetworkStatus:(NSNotification *)notice 
{ 
    recheabilityBool=FALSE; 
    nonrecheabilityBool=FALSE; 
    // called after network status changes 
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus]; 
    switch (internetStatus) 
    { 
     case NotReachable: 
     { 
      nonrecheabilityBool=TRUE; 
      internetCon=0; 
      //NSLog(@"The internet is down."); 


      break; 
     } 
     case ReachableViaWiFi: 
     { 
      NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
      internetCon=404; 
      [prefs setInteger:internetCon forKey:@"conKey"]; 

      //NSLog(@"The internet is working via WIFI."); 
      break; 

     } 
     case ReachableViaWWAN: 
     { 
      //NSLog(@"The internet is working via WWAN."); 

      break; 
     } 
    } 

    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus]; 
    switch (hostStatus) 
    { 
     case NotReachable: 
     { 
      internetCon=0; 
      if(nonrecheabilityBool==FALSE) 
      { 
       //NSLog(@"A gateway to the host server is down."); 
      } 
      break; 

     } 
     case ReachableViaWiFi: 
     { 
      if(recheabilityBool==FALSE) 
      { 

       recheabilityBool=TRUE; 

       NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
       internetCon=404; 
       [prefs setInteger:internetCon forKey:@"conKey"]; 


       //NSLog(@"The internet is working via WIFI."); 
       break; 
      } 


      //NSLog(@"A gateway to the host server is working via WIFI."); 

      break; 
     } 
     case ReachableViaWWAN: 
     { 
      //NSLog(@"A gateway to the host server is working via WWAN."); 
      break; 
     } 
    } 
} 


- (BOOL)connected 
{ 
    Reachability *reachability = [Reachability reachabilityForInternetConnection]; 
    NetworkStatus networkStatus = [reachability currentReachabilityStatus]; 
    return !(networkStatus == NotReachable); 
} 
2

У меня такая же проблема с достижимостью Тони Миллиона: статус сети всегда был установлен на Нет tReachable. исправить его с добавив SystemConfiguration Framework

Надеется, что это помогает

+0

Это помогает решить мой случай, но это должно быть указано в комментарии – Raptor

0

Другого полный ответ:

-(BOOL) isReachable:(NSString *)url 
{ 
    //Retrieve the host name by given url address. 
    NSString *hostName = [[NSURL URLWithString:url] host]; 
    Reachability *r = [Reachability reachabilityWithHostName:hostName]; 

    if(NotReachable == [r currentReachabilityStatus]) { 
     NSLog(@"Not Reachable"); 
     return NO; 
    } 
    NSLog(@"Reachable"); 
    return YES; 
} 
+0

Он работает нормально в первый раз. Мне нужно проверить доступность хоста для каждого действия. Но всегда возвращайтесь через Wifi. Не хозяин, недоступный или нет. –

+0

в соответствии с файлом класса Reachbilty от Apple, «Возможность расширения не может сообщить вашему приложению, если вы можете подключиться к определенному хосту, только тот доступный интерфейс, который может разрешить соединение, и является ли этот интерфейс WWAN». [Apple Reachbilty] (https://developer.apple.com/library/content/samplecode/Reachability/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007324-Intro-DontLinkElementID_2) –

Смежные вопросы