2009-08-17 7 views
1

私のアプリにwebViewが表示される前に/ときに "到達可能性"をチェックしたいと思います。Reachability - webViewを表示する前のベストプラクティス

これまでのところ、reachbility.h/.mファイルを含めて、SystemConfiguration.frameworkをプロジェクトに追加しました。

これは、私がインターネット上で見つけた契約、投稿やブログなどのすべてからどこにあるのか、それ以降は何をすべきかについて意見が異なります。また、実際に完全な解決法ではない多くの部分コードスニペットを見つけました。どのようにそれらを使用するなどのための呼び出し可能メソッドなど。

私はまた、到達可能性をチェックする前に再接続する...しかし、私はコンセンサスまたは完全な解決策を見つけていない。私のアプリは余分なコードなしで無線LANに再接続しているようだ...だから私はここでも混乱している...

泥水を取り除くための助けがあれば幸いである。私は単純な単純な解決策を探しています。受け入れ

回答:私はあなたが次のことをやりたいということ...このQ /以降を読んでも初心者に注意したいと思います:

あなたの.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

インターネットアクセスが必要な場合、私は常にApp Delegateでこのメソッドを使用しています。私は時間の経過とともにそれをさまざまなアクセスタイプに合わせて調整してくれました。これは、このトピックに関するGoogleの簡単な検索の後に見つけることができる多くの方法の1つの変形です。

これを回避するための難しい高速戦略を思いつくのは難しいことです。プラットフォーム自体は、それぞれの特定のアプリケーションのニーズに基づいて長所と短所を持つさまざまな接続オプションを提供します。以下に使用する方法は、デバイスがいくつかの接続メカニズムを介してインターネットに接続できる一般的な接続テストです。

- (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およびcontrollerがエラーを報告しています。何が欠落しているかも知っていますか? – saman01

+0

共有設定は、共通の設定を保持するクラスのインスタンスであり、ControllerはアプリケーションのメインのView Controllerです。アプリに合わせて変数名を変更する必要があります。 – MystikSpiral

0

は、私はその方法は(一番下に、testConnection)すべての呼び出しでNSURLConnectionをリークしていると信じています。

代わり

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

を使用する場合があります。

関連する問題