2012-09-25 63 views
2

這是我在我的應用程序使用的可達性代碼:蘋果可達通知對網絡或Wi-Fi

- (void) handleNetworkChange:(NSNotification *)notice 
{ 

    NetworkStatus remoteHostStatus = [reachability currentReachabilityStatus]; 

    if(remoteHostStatus == NotReachable) { 
     UIAlertView *alertnew = [[UIAlertView alloc] initWithTitle:@"No Internet Connection!" message:@"Your device lost internet connection!" 
                 delegate:self 
               cancelButtonTitle:@"Close" 
               otherButtonTitles:@"Dismiss", nil]; 
     [alertnew show]; 
    } else if (remoteHostStatus == ReachableViaWWAN) { 
     //if connected to the Network 
     UIAlertView *alertre = [[UIAlertView alloc] initWithTitle:@"Internet Connection!" message:@"Your device re-connected to the internet!" 
                 delegate:self 
               cancelButtonTitle:nil 
               otherButtonTitles:@"Ok!", nil]; 
     [alertre show]; 
    } else if (remoteHostStatus == ReachableViaWiFi) { 
     //if connected to Wi-Fi 
     UIAlertView *alertre = [[UIAlertView alloc] initWithTitle:@"Internet Connection!" message:@"Your device re-connected to the internet!" 
                 delegate:self 
               cancelButtonTitle:nil 
               otherButtonTitles:@"Ok!", nil]; 
     [alertre show]; 
    } 

} 

我想,當他們失去了網絡,當他們獲得回來,以提醒用戶。但是我遇到的問題是,當用戶使用iPhone(具有持續的網絡連接)並且他們連接到Wi-Fi時,他們會在他們已經連接時收到警報。所以我只想提醒他們,如果他們沒有互聯網連接並連接到Wi-Fi。此代碼適用於沒有數據計劃的iPod和iPad,但問題出在iPhones上。有什麼我可以做的編輯這個,並使其只顯示一個或另一個警報?

我嘗試此代碼爲最後警告:

else if (remoteHostStatus == ReachableViaWiFi && !(remoteHostStatus == ReachableViaWWAN)) { 
     //if connected to Wi-Fi but without Network 
     UIAlertView *alertre = [[UIAlertView alloc] initWithTitle:@"Internet Connection!" message:@"Your device re-connected to the internet!" 
                 delegate:self 
               cancelButtonTitle:nil 
               otherButtonTitles:@"Ok!", nil]; 
     [alertre show]; 
    } 

但這並沒有解決問題...

+0

我可以在Stackoverflow中寫下我的問題,還是希望我使用您的網站 –

回答

3

在你的代碼的邏輯基本錯誤是,你是治療三個獨立稱爲兩個州。在蘋果的Reachability例如NetworkStatus由這裏看到的enum定義:

typedef enum { 
    NotReachable = 0, 
    ReachableViaWiFi, 
    ReachableViaWWAN 
} NetworkStatus; 

既然你主要想BOOL(可達與否)。只需將當前的網絡狀態與NotReachable進行比較即可。因此,在ReachableViaWiFiReachableViaWWAN的情況下,BOOLYES

BOOL reachable = (_reachability.currentReachabilityStatus != NotReachable); // underbar added for good ivar style. 

現在你只需要處理這種情況,你有WiFi和移動到蜂窩或反之亦然。對於這種情況,您將不得不跟蹤通話之間的狀態。添加一個名爲_reachable的伊娃爾BOOL。然後在你的觀察者方法中比較你的新值。

-(void)reachabilityDidChange:(NSNotification *)note{ 
    BOOL reachable = (_reachability.currentReachabilityStatus != NotReachable); 
    if (reachable != _reachable){ 
     // State Changed. Inform the user if necessary. 
     if (reachable){ 
      // Connected. 
     } else { 
      // Lost connection. 
     } 
    } 
    _reachable = reachable; 
} 

警告:低於去年

一記不請自來的勸告對一般的這些UIAlertView S的想法。警報實質上是對用戶尖叫。關於重新連接的警報本質上是喊「嘿!一切都好了!」。我想推薦觀看WWDC2012的會議221,他們談論了常見的設計缺陷。大約35分鐘後,他們開始講警報。很顯然,他們試圖儘量避免使用警報。

+0

感謝您提供的所有信息,現在您已經說過關於AlertView,我同意。再次感謝! – tcd

+0

感謝您的代碼,但可以解釋把所有的代碼放在哪裏(我也想要@tdun正在做的)... –

+0

@Programmer ...在這裏查看我的個人資料,通過我的網站給我發電子郵件和我可以幫你。 – tcd