Класс достижимости с IP - PullRequest
       0

Класс достижимости с IP

2 голосов
/ 06 декабря 2011

Я изменил класс достижимости Apple, чтобы использовать его с ip моего сервера. Но когда я использую reachabilityWithAddress, он не называется reachabilityChanged во время запуска приложения. Он называется только статус подключения к интернету изменен. (например, выключение, включение Wi-Fi) Но если я использую функцию reachabilityWithHostName, reachabilityChanged, вызываемую при запуске приложения.

Чего мне не хватает?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    ///////////////////////////////////////////////////////////////////////////////////
    // Reachability Local Notifications 
    ///////////////////////////////////////////////////////////////////////////////////
    hasInternetConnection = NO;
    struct sockaddr_in address;
    address.sin_len = sizeof(address);
    address.sin_family = AF_INET;
    address.sin_port = htons(80);
    address.sin_addr.s_addr = inet_addr("X.X.X.X");
    [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name:kReachabilityChangedNotification object: nil];
    hostReach = [Reachability reachabilityWithAddress:&address];
    [hostReach startNotifier];

    ...

}

Тогда в методе:

-(void)reachabilityChanged:(NSNotification*)note
   {
    Reachability* curReach = [note object];
    NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
    if ( curReach == hostReach ) {
        NetworkStatus netStatus = [curReach currentReachabilityStatus]; 
        if ( netStatus != ReachableViaWiFi && netStatus != ReachableViaWWAN ) {
            hasInternetConnection = NO;
        }
        else {
            hasInternetConnection = YES;
        }
    }
    else {
        DLog(@"Something go wrong!");
    }
}

1 Ответ

2 голосов
/ 22 декабря 2011

При использовании селектора reachabilityWithHostName: вы получаете уведомление вскоре после инициализации Reachability b / c, достижимость имени хоста неизвестна до тех пор, пока это имя не будет разрешено.Для reachabilityWithAddress: состояние достижимости уже известно, поэтому нет никаких изменений в отчете.

Я решил проблему, добавив следующие три строки к самому внутреннему блоку «если» в reachabilityWithAddress: function.

SCNetworkReachabilityFlags flags;
SCNetworkReachabilityGetFlags(reachability, &flags);
ReachabilityCallback(reachability, flags, retVal);

Вызывает ту же функцию обратного вызова, которая была бы вызвана, если достижимость действительно изменилась.Поэтому, если вы полностью зависите от уведомления, как и я, это приведет к публикации уведомления после инициализации достижимости.

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