2013-03-09 24 views
3

今天,我公開了我的Beta版應用。我在一家旅館,並且還沒有獲得WiFi的訪問代碼。在測試可達性時,我注意到它沒有失敗,因爲它應該有。這是連接到WiFi的,但沒有任何實際可達,因爲我沒有登錄。此用例應該可覆蓋reachabilityWithHostname。這裏是我的代碼:iOS可達性無法捕捉連接到WiFi但未登錄的情況

在AppDelegate.h:

@interface AppDelegate : UIResponder <UIApplicationDelegate> { 

    Reachability* hostReach; 
    Reachability* internetReach; 
    Reachability* wifiReach; 
} 

在AppDelegate.m:

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

    wifiReach = [Reachability reachabilityForLocalWiFi]; 
    [wifiReach startNotifier]; 

    hostReach = [Reachability reachabilityWithHostname: @"http://www.google.com"]; 
    [hostReach connectionRequired]; 
    [hostReach startNotifier]; 

在需要連接模塊(S):

- (BOOL) isInternetReachable 
{ 
    Reachability *currentReach = [Reachability reachabilityForInternetConnection]; 
    NetworkStatus netStatus = [currentReach currentReachabilityStatus]; 


    return (netStatus == ReachableViaWiFi || netStatus == ReachableViaWWAN); 
} 

有誰知道如何掩蓋這種情況?

+1

只是一個評論:我嘗試使用比google.com更不出名的站點進行可達性測試,以防某些本地設備正在緩存流量。 – 2013-03-09 03:06:33

+0

問題是,這種情況實際上很難涵蓋。您的酒店在正確登錄之前確實將主機(如google.com)解析爲登錄網站IP(我認爲這是一個系統性錯誤)。 – Till 2013-03-09 03:06:36

+0

當我們的應用程序被髮送到重定向頁面時,我遇到了同樣的問題。 – Unome 2015-01-20 21:58:01

回答

3
... 
[Reachability reachabilityWithHostname: @"http://www.google.com"] 
... 

您應該使用主機名(無http://)每Apple's documentation

+0

是的,這也是,但即使如此,您應該嘗試連接,因爲如果您尚未連接,它可以啓動無線電並連接到網絡。 – EricS 2013-03-09 03:24:06

+2

這並沒有解決我問到的情況。正如Till在上面所述,酒店的用戶網絡可以*看到像Google這樣的網站,但是在登錄前無法真正到達該網站,因爲網絡會將所有網站重定向到他們的登錄頁面。我想我真的需要想出一種方法來檢索來自特定調用的已知數據,並在聲明應用程序「連接」之前測試其有效性。 – mpemburn 2013-03-12 00:47:40

3

您正在使用可達性錯誤。蘋果的文檔非常糟糕,所以忽略它。

竅門是試圖建立一個網絡連接沒有第一次諮詢可達性。 NSURLConnection將啓動無線電並根據需要建立連接。當然,一定要處理錯誤。

當離線後網絡恢復聯機時,可達性仍然有用。如果您有預先無法發送/接收的信息,您可以重試連接。

此外,你不應該在主線程上調用Reachability。在質量較差的網絡上,尤其是丟包率較高或DNS損壞的網絡,可達性會使您的應用停留超過20秒,系統將導致您無法訪問。

+1

我*從未*看到可達性阻止應用程序。它的設計是異步的。 – 2013-03-09 03:22:20

+1

DNS查找會鎖定某些不良網絡上的應用程序,除非Apple自上次查看後已修復該應用程序。要測試,請在將設備的DNS服務器設置爲隨機未使用的本地IP地址後嘗試運行您的應用程序。另一個好的測試是使用Mac作爲您的互聯網代理服務器,然後使用ipfw(或Network Link Conditioner)刪除所有數據包。我使用tinyproxy,但其他人使用互聯網共享代替。 – EricS 2013-03-09 03:39:19

0

的可達性的示例使用SystemConfiguration's Reachability API

遠程主機被認爲是可到達時的數據包,由應用到網絡棧發送的,可以離開本地設備。可達性不保證數據包實際上會被主機接收。

它可能做了兩兩件事:

  • (?反覆)域名解析爲IP地址。
  • 觀察路由表並在該IP的「可達性」更改時發送回調。

captive portal(又名的Wi-Fi登錄頁面)的情況下,http://www.example.com已經出現在您的網頁瀏覽器重定向到登錄頁面的網站;這意味着www.example.com必須解決(無論是否爲其實際IP),並且必須有該IP的站點才能將您重定向到登錄頁面。

可達性主要用於檢測諸如飛行模式或與Wi-Fi斷開連接。

3

我使用可達性來證明網絡層。當它應該沒問題時,我會嘗試從我的服務器加載一個字節的文件以確保它的安全。性能還可以。

BOOL isOnline = [[[RKClient sharedClient] reachabilityObserver] isReachabilityDetermined] != YES || [[RKClient sharedClient] isNetworkReachable]; 

    if(isOnline){ 
     NSData *data = [NSData dataWithContentsOfURL:[[URLManager sharedInstance]availabilityCheckURL]]; 

     NSString *strTemp = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
     isOnline = [strTemp isEqualToString:@"1"]; 
    } 
相關問題