2012-12-06 1 views

ответ

35

Лучший способ - использовать код для повышения эффективности. Проверьте here for apple sample code. То есть много удобных методов, чтобы проверить доступность Интернет, Wi-Fi/WAN проверка подключения и т.д ..

Для например: -

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

reachability = [Reachability reachabilityForInternetConnection]; 
[reachability startNotifier]; 

- (void)networkChanged:(NSNotification *)notification 
{ 

    NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; 

    if(remoteHostStatus == NotReachable) { NSLog(@"not reachable");} 
    else if (remoteHostStatus == ReachableViaWiFiNetwork) { NSLog(@"wifi"); } 
    else if (remoteHostStatus == ReachableViaCarrierDataNetwork) { NSLog(@"carrier"); } 
} 
+3

Как вы узнаете, кто остановился? Кстати .. +1 за ваш ответ :) – TonyMkenu

+1

'ReachableViaCarrierDataNetwork' &' ReachableViaWiFiNetwork' недоступны, статус может быть 'ReachableViaWWAN' или' ReachableViaWiFi'. – Hemang

+0

после уведомления только он показывает, но это необходимо, прежде чем сеть изменится. как получить доступную сеть при вызове метода viewdidload .. – Bala

10

Попробуйте этот код:

- (BOOL)connectedToInternet 
{ 
    NSURL *url=[NSURL URLWithString:@"http://www.google.com"]; 
    NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url]; 
    [request setHTTPMethod:@"HEAD"]; 
    NSHTTPURLResponse *response; 
    [NSURLConnection sendSynchronousRequest:request returningResponse:&response error: NULL]; 

    return ([response statusCode]==200)?YES:NO; 
} 
11

достижимости имеет много к нему больше, чем нужно, плюс он еще не обновлен для ARC.

Вот мое решение в чистом C. Большая часть кода была взята непосредственно из Reachability, но переделана только до того, что необходимо. Я только хотел, чтобы он возвращал, было ли или нет соединение с Интернетом, но вы можете прочитать из комментариев, возвращает ли он ДА на основе поиска Wi-Fi или сотовой сети.

Прежде чем перейти к использованию кода, необходимо зайти в свою цель: выберите вкладку «Фазы сборки» и добавьте «SystemConfiguration.framework» в список «Link Binary With Libraries».

#import <CoreFoundation/CoreFoundation.h> 
#import <SystemConfiguration/SystemConfiguration.h> 
#import <netdb.h> 

BOOL networkReachable() 
{ 
    struct sockaddr_in zeroAddress; 
    bzero(&zeroAddress, sizeof(zeroAddress)); 
    zeroAddress.sin_len = sizeof(zeroAddress); 
    zeroAddress.sin_family = AF_INET; 

    SCNetworkReachabilityRef reachabilityRef = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *) &zeroAddress); 

    SCNetworkReachabilityFlags flags; 
    if (SCNetworkReachabilityGetFlags(reachabilityRef, &flags)) { 
     if ((flags & kSCNetworkReachabilityFlagsReachable) == 0) { 
      // if target host is not reachable 
      return NO; 
     } 

     if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0) { 
      // if target host is reachable and no connection is required 
      // then we'll assume (for now) that your on Wi-Fi 
      return YES; // This is a wifi connection. 
     } 


     if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand) != 0) 
      ||(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0)) { 
      // ... and the connection is on-demand (or on-traffic) if the 
      //  calling application is using the CFSocketStream or higher APIs 

      if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0) { 
       // ... and no [user] intervention is needed 
       return YES; // This is a wifi connection. 
      } 
     } 

     if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN) { 
      // ... but WWAN connections are OK if the calling application 
      //  is using the CFNetwork (CFSocketStream?) APIs. 
      return YES; // This is a cellular connection. 
     } 
    } 

    return NO; 
} 
+0

Мне нравится ваше решение много, но лично я бы сделал небольшую модификацию. Я думаю, вместо того, чтобы возвращать BOOL, вы должны вернуть константу или элемент ENUM, чтобы мы могли определить, есть ли соединение и какой тип. К счастью эту модификацию не сложно сделать! –

+1

Я считаю, что ошибся здесь и что этот код просачивается. SCNetworkReachabilityRef необходимо отправить в CFRelease() в какой-то момент ... лучший способ сделать это может состоять в том, чтобы разбить SCNetworkReachabilityGetFlags() и сохранить его значение, а затем освободить refability ref, затем перейти к if и проверить сохраненное значение. Таким образом освобождается память, занятая SCNetworkReachability, хранящаяся в куче, но все, что вам нужно в этой точке (флаги и возвращаемое значение SCNetworkReachabilityGetFlags()) по-прежнему доступны в стеке. – ArtOfWarfare

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