2011-12-06 33 views
2

我修改了蘋果的可達性類以便與我的服務器ip一起使用。但是當我使用reachabilityWithAddress時,它不會在應用啓動時調用reachabilityChanged。它只被稱爲互聯網連接狀態已更改。 (就像關閉Wi-Fi一樣),但是,如果我使用reachabilityWithHostName,reachabilityChanged函數在應用啓動時調用。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」塊。

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

這調用了相同的回調函數,如果可達性實際發生了變化,該回調函數將被調用。因此,如果您完全依賴通知,就像我一樣,這會導致通知在初始化可達性後發佈。