2009-08-15 14 views
8

私は検索しましたが、似たような質問は表示されません。インターネットに接続していても到達可能性が失われることがあります

Reachabilityの例でインターネット接続を確認する方法を追加しました。ほとんどの場合は動作しますが、iPhoneにインストールすると、インターネット接続(3G/EDGEの場合 - WiFiはOK)であっても失敗することがよくあります。

以下のコードは、基本的にNOを返します。

別のアプリに切り替えると、「Mail」や「Safari」と言い、接続してアプリに戻ると、インターネットにアクセス可能であるというコードが表示されます。それはそれが "ナッジ"が必要なように思える。

誰でもこれまでに見たことがありますか?何か案は?

感謝 ジェームズ

+ (BOOL) doWeHaveInternetConnection{ 

BOOL success; 
// google should always be up right?! 
const char *host_name = [@"google.com" cStringUsingEncoding:NSASCIIStringEncoding]; 

SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, 
                      host_name); 
SCNetworkReachabilityFlags flags; 
success = SCNetworkReachabilityGetFlags(reachability, &flags); 
BOOL isAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired); 

if (isAvailable) { 
    NSLog(@"Google is reachable: %d", flags); 
}else{ 
    NSLog(@"Google is unreachable"); 
} 

return isAvailable; 

}

答えて

7

あなたはアップルのサンプルコードからいくつかの基本的な到達可能コードを取り除かきたように見えます。あなたはそれをそのまま残してこれを行うとどうなりますか?

Reachability *hostReach = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain]; 

NetworkStatus netStatus = [hostReach currentReachabilityStatus]; 

if (netStatus == NotReachable) 
{ 
    NSLog(@"NotReachable"); 
} 

if (netStatus == ReachableViaWiFi) 
{ 
    NSLog(@"ReachableViaWiFi"); 
} 

if (netStatus == ReachableViaWWAN) 
{ 
    NSLog(@"ReachableViaWWAN"); 
} 
+0

謝罪、私はちょっとした騒ぎです。 プロジェクトにReachabilityクラスのサンプルを追加しましたが、コンパイルできません。 \t到達可能性* hostReach = [[reachability reachabilityWithHostName:@ "www.apple.com"]保持]; 動作しません。 reachabilityWithHostNameメソッドが見つかりません。 私はこの作品微調整... – stoutyhk

+0

しておこう: +(BOOL)doWeHaveInternetConnection2 { \t \t場合([[到達可能性sharedReachability] internetConnectionStatus] == NotReachable){ \t \tリターンNO。 \t} \t他 \t {\t \tリターンYES。 \t} \t } – stoutyhk

+1

このコードでは、接続されているにも関わらず、常に「NotConnected」と表示されます。一度それが "reachabilityChanged"メソッドに行くと、それはあなたに正しいステータスを与えます。どのようにして最初の正しい状態を取得するのですか? – Nnp

1
+ (BOOL) doWeHaveInternetConnection2{ 
     if([[Reachability sharedReachability] internetConnectionStatus] == NotReachable) { 
        return NO; 
      } 
      else 
      { 
        return YES; 
      } 

} 

(申し訳ありませんが、コードのフォーマットは、コメントでは動作しませんでした)

+0

'+ sharedReachability'を呼び出すと、2.0より前のバージョンのReachabilityを使用していることがわかります。最新のバージョンは1週間ほど前に投稿されており、シングルトンを使用したものよりもはるかに優れています。以下のマットの答えは最新バージョンに基づいているため、コンパイルに問題がありました。最新のバージョンを入手して、それがあなたのニーズに合っているかどうかを確認してください。 – Tim

+0

ありがとうございます - 新しいバージョンがあったのを知らなかった。どうもありがとう。 – stoutyhk

1

バージョン2では、コードは次のようになります。

私が見つけた何
+ (BOOL) doWeHaveInternetConnection2{ 

if([Reachability reachabilityForInternetConnection] == NotReachable) { 
    return NO; 
} 
else 
{ 
    return YES; 
} 

}

+0

// reachabilityForInternetConnection-デフォルトルートが利用可能かどうかをチェックします。 //特定のホストに接続していないアプリケーションで使用する必要があります – stoutyhk

+0

この昨夜のiphoneデバイスで飛行機モードでテストしたところ、このコードはYESを返しましたが、URLを取得すると失敗しました。だから私はこれを使わないだろう。特定のホストへの接続をチェックすることに戻ります。 – stoutyhk

+0

reachabilityWithHostNameを使用して特定のホストへの接続をテストすると、電話にIPアドレスが割り当てられている場合はいつでも偽陽性が返されます。それを試してください:あなたの携帯電話が接続されている間にワイヤレスルータからケーブルを抜き、[Reachability reachabilityWithHostName:]の結果をチェックしてください。 – Oscar

1

あなたが最初にstartNotifierと呼ぶスレッド(runloop)を知っておく必要があるということです。バックグラウンドスレッドまたはNSOperationから呼び出すと、そのスレッドの実行ループでノーティファイアループが開始されます。 のようにインスタンスを共有している場合は、最後の呼び出し元が勝利し、通知ループが実行ループに設定された現在のコード(2.0)から表示されます。

関連する問題