1

インターネットへの接続が失われたときにアラート ビューを表示するように到達可能性をセットアップしようとしています。

到達可能性が実際にどのように機能するかを理解するのに苦労しています。ドキュメントを読み、Apple からレビューするためにサンプル アプリをセットアップしましたが、コードとそれがどのように機能するかをよりよく理解したいと思います。

セットアップ内で、次の 2 つのことを探しています。1. インターネットへの接続が失われたときに通知する 2. ホスト アドレスへの接続が失われたときに通知する

接続が失われたときにアプリケーション内の任意の時点で UIAlertView を表示したいので、コードは Application Delegate 内でセットアップされます。

シナリオ 1 では、UIAlertView を表示して、接続が失われたことをユーザーに通知しようとしています。クリックすると [再試行] ボタンが表示されます。アラート ビューが再度表示されない場合は、接続をもう一度テストして、インターネット接続が回復したかどうかを確認してください。

コード: アプリ デリゲート インプ ファイル:

//Called by Reachability whenever status changes.
- (void)reachabilityChanged:(NSNotification* )note {
Reachability *curReach = (Reachability *)[note object];
NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
NSLog(@"Reachability changed: %@", curReach);
networkStatus = [curReach currentReachabilityStatus];

if (networkStatus == NotReachable) {
    NSLog(@"NOT REACHABLE");\
    UIAlertView *connectionNotReachable = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"connectionNotReachableTitle", @"Title for alert view - connection Not Reachable") message:NSLocalizedString(@"connectionNotReachableMessage", @"Message for alert view - connection Not Reachable") delegate:self cancelButtonTitle:nil otherButtonTitles:NSLocalizedString(@"connectionNotReachableTryAgain", @"Try again button for alert view - connection Not Reachable"), nil];

    [connectionNotReachable show]; 
    return;
} else {
    NSLog(@"REACHABLE");
}
}

- (void)monitorReachability {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:ReachabilityChangedNotification object:nil];

self.hostReach = [Reachability reachabilityWithHostName: @"api.parse.com"];
[self.hostReach startNotifier];

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

}

混乱: 私が理解していないのは、このコードが実際にどのように機能するかです。だから私の中で私application didFinishLaunchingWithOptions:は電話します[self monitorReachability]

これにより、hostReach と internetReach の通知機能がセットアップされると思います。しかし、reachabilityChangedメソッド内で、これが hostReach == NotReachable であるか、internetReach == Not Reachable であるかの違いをどのように判断しますか。

理想的には、hostReach に到達できません。現時点では、この特定の API に到達できない可能性があるため、あまりやりたくありません。そのため、その間アプリに完全にアクセスできなくしたくありません。

4

1 に答える 1

4

アプリケーションはkReachabilityChangedNotification、ネットワークの状態が変化するたびにリッスンしてプロンプトを表示します。このような通知の登録

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityHasChanged:) name:kReachabilityChangedNotification object:nil];

    self.internetReachable = [[Reachability reachabilityForInternetConnection] retain];
    [self.internetReachable startNotifier];


// check if a host is reachable
self.hostReachable= [Reachability reachabilityWithHostname:@"www.google.com"];
[self.hostReachable startNotifier];

基本的に、スイッチケース内などでグローバルフラグを設定しBOOL isReachable、ネットワークの到達可能性ステータスに従って更新できます。どこにいてもアプリケーションで、グローバルフラグを確認してif(!isReachable)からアラートを表示できます

-(void) reachabilityHasChanged:(NSNotification *)notice
{
    // called after network status changes
    NetworkStatus internetStatus = [self.internetReachable currentReachabilityStatus];
    switch (internetStatus)
    {
        case NotReachable:
        {
          UIAlertView *alert =[[UIAlertView alloc]initWithTitle:@"Errot" message:@"internet not reachable" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
         [alert show];
         isReachable=NO;

            break;
        }
        case ReachableViaWiFi:
        {
          NSLog(@"The internet is working via WIFI.");
          UIAlertView *alert =[[UIAlertView alloc]initWithTitle:@"Info" message:@"WIFI reachable" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
          [alert show];
          isReachable=YES;

            break;
        }
        case ReachableViaWWAN:
        {
          NSLog(@"The internet is working via WWAN.");
          UIAlertView *alert =[[UIAlertView alloc]initWithTitle:@"Info" message:@"WWAN/3G" delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
          [alert show];
          isReachable=YES;
           break;
        }
    }

  NetworkStatus hostStatus = [self.hostReachable currentReachabilityStatus];


switch (hostStatus)
{
    case ReachableViaWWAN:
    {
      //NSLog(@"3G");

      hostActive=YES;
      break;
    }
    case ReachableViaWiFi:
    {

      // NSLog(@"WIFI");

      hostActive=YES;
      break;
    }
    case NotReachable:
    {

      hostActive=NO;

      break;
    }

  }


 }

Reachability の使用を開始する際に問題が発生した場合は、 Reachabilityのサンプル コードをダウンロードしてください。

reachabilityForInternetConnectionクラスのメソッドを見るとReachability、特定のホストに焦点を当てることなく、一般的にインターネット接続をチェックしていることがわかります。インターネットゲートウェイが到達可能かどうかのみをチェックします。

   + (Reachability*) reachabilityForInternetConnection;

    {

        struct sockaddr_in zeroAddress;

        bzero(&zeroAddress, sizeof(zeroAddress));

        zeroAddress.sin_len = sizeof(zeroAddress);

        zeroAddress.sin_family = AF_INET;

        return [self reachabilityWithAddress: &zeroAddress];

    }
于 2013-03-12T21:03:57.213 に答える