Как проверить состояние сети в приложении iphone? - PullRequest
4 голосов
/ 14 апреля 2011

Я настроил несколько методов для проверки состояния сети в моем приложении.

В моем viewDidLoad методе я вызываю initNetworkCheck:

[self initNetworkCheck];
[super viewDidLoad];
if(internetActive == NO){     
    compose.enabled = NO;
}

Итак, я хочу при запуске проверить, подключено ли оборудование. Проблема в том, что он всегда дает мне НЕТ, но когда я регистрирую это, на самом деле, InternetActive - это ДА.

//[[[[[[network check methods
-(void)checkNetworkStatus:(NSNotification *)notice{
    NetworkStatus internetStatus = [internetReachable currentReachabilityStatus];
    switch (internetStatus) {
        case NotReachable:{
            self.internetActive = NO; 
            break;
        }
        case ReachableViaWiFi:{
            self.internetActive = YES;
            break;
        }
        case ReachableViaWWAN:{
            self.internetActive = YES;
            break;
        }
    }
    NetworkStatus hostStatus = [hostReachable currentReachabilityStatus];
    switch (hostStatus){
        case NotReachable:{
            self.hostActive = NO;
            break;
        }
        case ReachableViaWiFi:{
            self.hostActive = YES;
            break;
        }
        case ReachableViaWWAN:{
            self.hostActive = YES;
            break;
        }
    }

}
-(void)initNetworkCheck{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkNetworkStatus:) name:kReachabilityChangedNotification object:nil];

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

    hostReachable = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];
    [hostReachable startNotifier];
}
//]]]]]]

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 14 апреля 2011

Я лично использую следующее:

typedef enum
{
    NoConnection = 0,
    WiFiConnected,
    WWANConnected
} NetworkStatus;

NetworkStatus getNetworkStatus ( )
{
    struct sockaddr_in nullAddress;

    bzero(&nullAddress, sizeof(nullAddress));
    nullAddress.sin_len = sizeof(nullAddress);
    nullAddress.sin_family = AF_INET;

    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr*) &nullAddress);

    SCNetworkReachabilityFlags flags;
    SCNetworkReachabilityGetFlags(ref, &flags);

    if (!(flags & kSCNetworkReachabilityFlagsReachable))
        return NoConnection;

    if (!(flags & kSCNetworkReachabilityFlagsConnectionRequired))
        return WiFiConnected;

    if (((flags & kSCNetworkReachabilityFlagsConnectionOnDemand) ||
        (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic)) &&
        !(flags & kSCNetworkReachabilityFlagsInterventionRequired))
        return WiFiConnected;

    if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
        return WWANConnected;

    return NoConnection;
}

Я точно забыл, где, но где-то есть пример в SDK, на котором это основано.

РЕДАКТИРОВАТЬ: похоже, что Ник нашел это ...:)

1 голос
/ 14 апреля 2011

Предлагаю воспользоваться классом Apple Reachability. Здесь - образец приложения от Apple.

Пример приложения Reachability демонстрирует, как использовать Инфраструктура SystemConfiguration для контролировать состояние сети iPhone или iPod touch. В частности, это демонстрирует, как узнать, когда IP может будет маршрутизироваться и когда будет движение маршрутизируется через беспроводную широкую зону Сетевой (WWAN) интерфейс, такой как EDGE или 3G.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...