2012/07/07更新

[XCODE] ネットワークが圏外になったり、圏外から圏内に変わった事をアプリ上で知る方法

このエントリーをはてなブックマークに追加      

こんにちは、iPhoneアプリを絶賛開発中の@yoheiMuneです。
今日は、外部サーバーを使うアプリとかで、ネットワークが圏外になったり、圏外から復活した際に、 通知を受けて、処理を停止/再開を行えるようにする仕組みを紹介したいと思います(⌒▽⌒)

Reachability and NotificationCenter



利用する技術は、Reachabilityというクラスです

アップルから提供されているReachabilityというクラスを用いる事で、 現在のネットワーク状態を知ったり、ネットワーク状態が変わった際に通知を受ける事が可能です。
Reachabilityの導入方法は、こちらを参照頂けると幸いです(*´∇`*)

- [XCODE] ネットワーク接続が3GかWifiか圏外かを調べる簡単な方法@YoheiM.NET



ネットワーク状態が変化した際に通知を受ける方法

通知を受ける為に、NSNotificationCenterの機能を利用します。

上記リンク先の記事では、ネットワーク状態を知りたい時に、 アプリ側から問い合わせをするPull型の実装を紹介しましたが、今回は、 Push型の実装で、アプリ側からわざわざ問い合わせなくてもネットワーク状態の変化を教えてくれる 方法となります。

具体的な実装内容は、以下となります。

(Reachabilityのインスタンス化と、Notificationの設定)
// 例えば、通知を受けるクラスの初期化時に、Reachabilityの設定を行います。
-(id)init {
  self = [superinit];
  if (self) {
    // Reachabilityのインスタンスを作成し、フィールド変数に代入します。
    // インスタンス作成時に、どのサーバーとの通信状態を監視するかを
    // 設定します。
    reachability = [Reachability reachabilityWithHostName:@"www.google.com"];

    // 続いて、NSNotificationCenterに、
    // ネットワーク状態が変化した際に通知を受ける対象を指定します。
    [[NSNotificationCenter defaultCenter] 
       addObserver:self 
          selector:@selector(notifiedNetworkStatus:) 
              name:kReachabilityChangedNotification 
            object:nil];
    // ネットワーク監視を開始します。
    [reachability startNotifier];
  }

  return self;
}

(通知を受け取るメソッドでの実装例)
// 通知を受け取るメソッド
-(void)notifiedNetworkStatus:(NSNotification *)notification {

  // reachability変数から、現在のネットワーク状態を取得します。
  NetworkStatus networkStatus = [reachability currentReachabilityStatus];

  // 受け取ったネットワーク状態に合わせて、処理を行います。
  // 下記例の場合、wifiか3Gの状態になった場合には、startWorkを呼び出し、
  // 圏外になったら、stopWorkを呼び出しています。
  if (networkStatus == ReachableViaWiFi) {
      NSLog(@"wifi");
  
  } elseif (networkStatus == ReachableViaWWAN) {
      NSLog(@"3G");
  
  } else {
      NSLog(@"does not connect.");
      [self stopWork];
      return;
  }
  
  [self startWork];
}



参考資料

今回の参考資料は、以下となります。より詳しい内容は、以下をご参照頂けると幸いです(・∀・)
- Reachability.hのコメント部分
- NSNotificationCenter Class Reference



最後に

Reachabilityって便利なクラスですが、Cocoaフレームワークには入ってないのですね。不思議です。
あとNSNotificationCenterって便利なクラスですね。ほぼ始めて使いましたが、簡単に使えて良かったです☆

今回も最後までお読み頂きまして、ありがとうございました!






こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。