2013-03-12 69 views
1

我試圖設置可達性來顯示警報視圖,當互聯網連接丟失時。使用iOS可達性顯示UIAlertView

我很努力地理解實際可用性的可達性。我已閱讀documentation並設置示例應用程序以供蘋果公司審查,但我想更好地理解代碼及其工作原理。

在我的設置我找了兩件事情:1。 告訴我,當連接到互聯網丟失 2.告訴我,當連接主機地址丟失

的代碼是我的應用程序中設置代理我希望UIAlertView在連接丟失時出現在應用程序中的任何位置。

對於方案1,我期待顯示一個UIAlertView來通知用戶說連接丟失。點擊時會出現「再試一次」按鈕,然後再次測試連接,看看互聯網連接是否已經返回,如果不再顯示警報視圖。

代碼: 應用代表小鬼文件:

//Called by Reachability whenever status changes. 
- (void)reachabilityChanged:(NSNotification*)note { 
Reachability *curReach = (Reachability *)[note object]; 
NSParameterAssert([curReach isKindOfClass: [Reachability class]]); 
NSLog(@"Reachability changed: %@", curReach); 
networkStatus = [curReach currentReachabilityStatus]; 

if (networkStatus == NotReachable) { 
    NSLog(@"NOT REACHABLE");\ 
    UIAlertView *connectionNotReachable = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"connectionNotReachableTitle", @"Title for alert view - connection Not Reachable") message:NSLocalizedString(@"connectionNotReachableMessage", @"Message for alert view - connection Not Reachable") delegate:self cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"connectionNotReachableTryAgain", @"Try again button for alert view - connection Not Reachable"), nil]; 

    [connectionNotReachable show]; 
    return; 
} else { 
    NSLog(@"REACHABLE"); 
} 
} 

- (void)monitorReachability { 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:ReachabilityChangedNotification object:nil]; 

self.hostReach = [Reachability reachabilityWithHostName: @"api.parse.com"]; 
[self.hostReach startNotifier]; 

self.internetReach = [Reachability reachabilityForInternetConnection]; 
[self.internetReach startNotifier]; 

} 

困惑:我不明白的是該程序是如何實際工作。因此,在我的application didFinishLaunchingWithOptions:中,我致電[self monitorReachability]

我想這是爲hostReach和internetReach設置通知程序。但是,然後在reachabilityChanged方法內如何確定如果這是hostReach == NotReachable或internetReach ==不可達的區別。

理想情況下,HostReach無法訪問,我現在不想做太多工作,因爲這可能導致當時無法訪問此特定api。所以我不想在這段時間內完全讓應用程序無法訪問。

回答

4

當網絡狀態發生變化時,您的應用程序將會收聽kReachabilityChangedNotification &提示您。 您的通知,這樣註冊

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

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


// check if a host is reachable 
self.hostReachable= [Reachability reachabilityWithHostname:@"www.google.com"]; 
[self.hostReachable startNotifier]; 

基本上你可以設置一個全局標誌e.g BOOL isReachable根據網絡的可達狀態的狀態開關的情況下和更新中。在您的應用程序無論你在哪裏,你可以檢查全局標誌if(!isReachable)則顯示警報

-(void) reachabilityHasChanged:(NSNotification *)notice 
{ 
    // called after network status changes 
    NetworkStatus internetStatus = [self.internetReachable currentReachabilityStatus]; 
    switch (internetStatus) 
    { 
     case NotReachable: 
     { 
      UIAlertView *alert =[[UIAlertView alloc]initWithTitle:@"Errot" message:@"internet not reachable" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil]; 
     [alert show]; 
     isReachable=NO; 

      break; 
     } 
     case ReachableViaWiFi: 
     { 
      NSLog(@"The internet is working via WIFI."); 
      UIAlertView *alert =[[UIAlertView alloc]initWithTitle:@"Info" message:@"WIFI reachable" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil]; 
      [alert show]; 
      isReachable=YES; 

      break; 
     } 
     case ReachableViaWWAN: 
     { 
      NSLog(@"The internet is working via WWAN."); 
      UIAlertView *alert =[[UIAlertView alloc]initWithTitle:@"Info" message:@"WWAN/3G" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil]; 
      [alert show]; 
      isReachable=YES; 
      break; 
     } 
    } 

    NetworkStatus hostStatus = [self.hostReachable currentReachabilityStatus]; 


switch (hostStatus) 
{ 
    case ReachableViaWWAN: 
    { 
     //NSLog(@"3G"); 

     hostActive=YES; 
     break; 
    } 
    case ReachableViaWiFi: 
    { 

     // NSLog(@"WIFI"); 

     hostActive=YES; 
     break; 
    } 
    case NotReachable: 
    { 

     hostActive=NO; 

     break; 
    } 

    } 


} 

如果您在開始使用可達然後就download the sample code for Reachability面臨的問題。

如果你看看Reachability類中的方法reachabilityForInternetConnection,那麼你會發現它一般會檢查互聯網連接,而不關注特定的主機,它只會檢查互聯網網關是否可達。

+ (Reachability*) reachabilityForInternetConnection; 

    { 

     struct sockaddr_in zeroAddress; 

     bzero(&zeroAddress, sizeof(zeroAddress)); 

     zeroAddress.sin_len = sizeof(zeroAddress); 

     zeroAddress.sin_family = AF_INET; 

     return [self reachabilityWithAddress: &zeroAddress]; 

    } 
+0

謝謝,我確實提到了我在Apple問題中設置了示例應用程序。我的難處在於瞭解互聯網可達性與主機可達性之間的差異。以上所有內容實際上都在我的問題中,與您使用不同的互聯網連接狀態的情況略有不同...... – StuartM 2013-03-12 22:45:51

+0

是互聯網可訪問意味着Apple默認將主機設置爲可訪問LAN/Internet網關,但您可以通過將自定義主機設置爲自定義主機來設置自己的自定義主機。 – nsgulliver 2013-03-12 22:54:08

+0

我已經更新了我的答案,你可以看看它。 – nsgulliver 2013-03-12 23:01:14