2011-12-06 4 views
2

私のサーバーipで使用するappleの到達可能性クラスを変更しました。しかし、reachabilityWithAddressを使用すると、アプリの起動中にreachabilityChangedと呼ばれることはありません。それはインターネット接続状態のみが変更されたと呼ばれています。 (wi-fiをオンにするなど)ただし、reachabilityWithHostNameを使用した場合、reachabilityChangedは、アプリケーションの起動時に呼び出される関数です。Reachability Class with IP

私には何が欠けていますか?

方法で次に
- (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!"); 
    } 
} 

答えて

2

reachabilityWithHostName使用:セレクタあなたはすぐにその名前があるまで、B/Cのホスト名の到達性が知られていない到達可能性を初期化した後に通知を取得します解決されました。 reachabilityWithAddress:の場合、到達可能性のステータスは既にわかっているため、レポートは変更されません。

私はreachabilityWithAddress:機能の最も内側の「if」ブロックに次の3行を追加してこの問題を回避しました。

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

これは、到達可能性が実際に変更された場合に呼び出される同じコールバック関数を呼び出します。したがって、私がそうであるように通知に完全に依存している場合は、到達可能性を初期化した後で通知がポストされます。

関連する問題