2009-08-17 24 views
1

前最佳實踐我想/前檢查「可達性」時,我的應用程序顯示網頁視圖。可達性 - 顯示webView的

到目前爲止,我已經包括了reachbility.h/.m文件,以及添加的SystemConfiguration.framework到項目中。

這是關於我在那裏在互聯網上找到最終的協議,從所有的帖子和博客等等,等等每個人都有的以後做什麼不同的想法/意見。此外,我發現很多部分代碼片段並不是真正的完整解決方案,可調用方法可以調用等等。如何使用它們等。

我也發現有人警告你應該嘗試在檢查可達性之前重新連接......但我還沒有找到共識或完整的解決方案。我的應用程序似乎重新連接而無需任何額外的代碼連接WIFI ...所以我很困惑豆蔻這裏太...

任何幫助清除泥水,將不勝感激。我只是在尋找一個簡單直接的解決方案。

答修:我想指出來誰可以讀取這個問答新手/稍後...,你將要做到以下幾點:

添加這個到您的.h文件中:

- (BOOL) connectedToNetwork: (NSString *) remoteServer; 
- (void) appLoadError: (NSString *) altertTitle alertMessage: (NSString *) altertMsg; 

而且你需要在你的.m文件的頂部導入這些:

SYS/socket.h中

netinet/in.h中

netinet6/in6.h

ARPA/inet.h

ifaddrs.h

netdb.h中

SystemConfiguration/SystemConfiguration.h

糾正我,如果這是錯誤的...這似乎很好地工作對我來說...

回答

2

當我需要訪問Internet時,我總是在我的App Delegate中使用此方法。隨着時間的推移,我已經針對不同的訪問類型對它進行了調整,並且它爲我服務。這是在對此主題進行快速Google搜索後可以找到的許多方法之一的變體。

這是一件棘手的事情拿出解決這個一成不變的策略。該平臺本身提供了不同的連接選項,根據每個特定應用程序的需要有其優點和缺點。我在下面使用的方法只是一個通用連接測試,意味着設備可以通過某種連接機制連接到Internet。

- (BOOL) connectedToNetwork: (NSString *) remoteServer { 
    // Create zero addy 
    struct sockaddr_in zeroAddress; 
    bzero(&zeroAddress, sizeof(zeroAddress)); 
    zeroAddress.sin_len = sizeof(zeroAddress); 
    zeroAddress.sin_family = AF_INET; 

    // Recover reachability flags 
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); 
    SCNetworkReachabilityFlags flags; 

    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags); 
    CFRelease(defaultRouteReachability); 

    if (!didRetrieveFlags){ 
     NSLog(@"Error. Could not recover network reachability flags"); 
     return NO; 
    } 

    BOOL isReachable = flags & kSCNetworkFlagsReachable; 
    BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired; 
    BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection; 

    NSURL *testURL = [NSURL URLWithString: remoteServer]; 
    NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0]; 
    NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:self]; 

    return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO; 
} 

我通常在applicationDidFinishLaunching裏面調用這個。如果檢查返回false,通常會生成一條錯誤消息(請參見下文)。這是因爲Apple禁止通過設備上的主頁按鈕以外的任何方式退出應用程序。

... 
else if(![self connectedToNetwork: [NSString stringWithFormat: @"http://%@:%@/", sharedSettings.server, sharedSettings.port]]){ 
     [self appLoadError: @"No Internet Detected" alertMessage:@"This application requires an active Internet connection. No content is available."];   
} 
... 
- (void) appLoadError: (NSString *) altertTitle alertMessage: (NSString *) altertMsg { 
    UIAlertView *loadErr = [[UIAlertView alloc] initWithTitle: altertTitle message: altertMsg delegate: self cancelButtonTitle: @"OK" otherButtonTitles: nil]; 
    [loadErr show]; 
    [loadErr release]; 

    // Load static screen 
    UIImage *image = [UIImage imageNamed:@"Error_NoInternet.png"]; 
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 

    [controller setNavigationBarHidden: YES animated: NO]; 

    [window addSubview: imageView]; 
    [imageView release]; 
} 
+0

sharedSettings和控制器正在標記錯誤。你有什麼想法可能會失蹤? – saman01 2011-09-03 23:22:07

+0

共享設置是類中用於保存常用設置的實例,Controller是您應用的主視圖控制器,您可能需要更改變量名稱以適合您的應用。 – MystikSpiral 2011-09-04 15:34:19

0

只是一個快速的筆記,我認爲方法泄漏每次通話的NSURLConnection(在底部,testConnection)。

您可能需要使用

+ (NSURLConnection *)connectionWithRequest: 
     (NSURLRequest *)request delegate:(id)delegate 

代替。