0

現在、ネットワーク リクエストが Mac または iOS で可能かどうかを判断するコードを書いています。

Apple が提供する Reachability クラスを見るように言われる前に、それらを使用しても同じ結果が得られることを指摘しておきたいと思います。代わりに、必要なのは文字通りそれだけなので、自分で書いてみようと思いました。

Apple とまったく同じように、到達可能性オブジェクトを開始しました。

+ (Reachability*) reachabilityForInternetConnection;
{
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;
    return [self reachabilityWithAddress: &zeroAddress];
}

次に、[networkStatusForFlags:flags](または私のコードでは同等のもの)を呼び出すと、次のようになります。

NSLog(@"Reachability Flag Status: %c%c %c%c%c%c%c%c%c\n",
      (flags & kSCNetworkReachabilityFlagsIsWWAN)               ? 'W' : '-',
      (flags & kSCNetworkReachabilityFlagsReachable)            ? 'R' : '-',

      (flags & kSCNetworkReachabilityFlagsTransientConnection)  ? 't' : '-',
      (flags & kSCNetworkReachabilityFlagsConnectionRequired)   ? 'c' : '-',
      (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic)  ? 'C' : '-',
      (flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-',
      (flags & kSCNetworkReachabilityFlagsConnectionOnDemand)   ? 'D' : '-',
      (flags & kSCNetworkReachabilityFlagsIsLocalAddress)       ? 'l' : '-',
      (flags & kSCNetworkReachabilityFlagsIsDirect)             ? 'd' : '-'
      );

BOOL thereIsInternetAccess = NO;

if ((flags & kSCNetworkReachabilityFlagsReachable) != 0 && (flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
{
    thereIsInternetAccess = YES;
}
else
{
    thereIsInternetAccess = NO;
}

Mac の Wifi がオンかオフかに関係なく、コンソールに次の出力が表示さReachability Flag Status: -R -----l-れます。これは、インターネットが存在することを示しています (Rフラグが立てられているため) 。

何か不足していますか?どんな助けでも大歓迎です。

注: iOS シミュレーターを使用しています。しかし、それが問題になるとは思わないでください。

4

1 に答える 1

0

iOS シミュレーターが期待どおりに動作しません。

ネットワーク到達可能性のためにシステム構成フレームワークを使用すると、登録されたコールバック ( ) を使用して、Mac のネットワーク ステータスが更新されたときに通知されますSCNetworkReachabilitySetCallback。ただし、私のテストでは、フラグが毎回正しく返されていないようです。Mac アプリ ターゲットを持つ Mac または iOS デバイスで同じコードを使用すると、コードは期待どおりの結果で実行されます。

シミュレーターがアプリの唯一のテスト手段であってはならないもう 1 つの理由があります。

于 2014-05-19T09:27:31.700 に答える