iPhoneのネットワーク接続状況を確認 | 成長の果実

成長の果実

不完全でも良いから前に進む。

ネットワークの機能を使用するアプリを作るときに、iPhoneのネットワーク接続状況確を確認したい。


確認したいことは、通信対象のホスト(www.google.comとか)に接続できるか、3G回線は繋がっているか、Wi-Fiは繋がっているか。


当然、ホストに接続できない場合はサーバーとかがダウンしている可能性があるのでアラート処理なんかをさせたいし、3G回線とWi-Fiの両方が接続されていない、つまり圏外のときもアラート処理させたりしたい。


上記を実現するに当たり、Appleのサンプルコードに Reachability という大変便利なクラスがあるので、それを使わせてもらう。本当にありがたい。


Reachability

http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html




上記サイトからサンプルコードをダンロードして、その中にある下記のファイルを自分のプロジェクトに追加する。

 
  • Reachability.h
     
  • Reachability.m


    あと、SystemConfiguration.framework というフレームワークが必要なので、これも追加する。
    SystemConfiguration.framework はiOS4に含まれているので普通に追加すればOK.


    追加したあとはこんな感じになる。

    $成長の果実-reachability01



    準備は整ったので、処理を実行させたいビューに処理を書いていく。


    今回はアプリ起動時に最初に呼び出される FirstViewController に処理を書いた。

    下記、コード。

    主要部分だけを説明していく。赤字の部分がポイント箇所。


    ◎FirstViewController.h

    #import <UIKit/UIKit.h>
    #import "Reachability.h"


    @class Reachability;


    @interface FirstViewController : UIViewController {
    Reachability* hostReach; // ホスト接続
    Reachability* internetReach; // 3Gネットワーク
    Reachability* wifiReach; // Wi-Fi

    }

    @end



    ◎FirstViewController.m

    #import "FirstViewController.h"


    @implementation FirstViewController

    - (void)viewDidLoad
    {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    // ネットワーク接続状況確認
    [self reachabilityStart];

    }

    //--------------------------------------------------
    // ネットワーク接続状況確認
    //--------------------------------------------------
    - (void) updateInterfaceWithReachability:(Reachability*)curReach
    {
    // 接続状態を取得
    NetworkStatus status = [curReach currentReachabilityStatus];

    // ホスト接続
    if(curReach == hostReach)
    {
    if( status == NotReachable )
    {
    NSLog(@"Host connection is failed.");
    } else {
    NSLog(@"Host connection is successful.");
    }
    }

    // 3Gネットワーク接続
    if(curReach == internetReach)
    {
    if( status == NotReachable )
    {
    NSLog(@"3G network is failed.");
    } else {
    NSLog(@"3G network is successful.");
    }
    }

    // Wi-Fi接続
    if(curReach == wifiReach)
    {
    if( status == NotReachable )
    {
    NSLog(@"Wi-Fi is failed.");
    } else {
    NSLog(@"Wi-Fi is successful.");
    }
    }
    }

    // ネットワーク接続状況確認
    - (void)reachabilityStart
    {
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(reachabilityChanged:)
    name: kReachabilityChangedNotification
    object: nil];

    // ホスト接続を確認
    hostReach = [[Reachability reachabilityWithHostName: @"www.apple.com"] retain];
    [hostReach startNotifier];
    [self updateInterfaceWithReachability: hostReach];

    // 3G接続を確認
    internetReach = [[Reachability reachabilityForInternetConnection] retain];
    [internetReach startNotifier];
    [self updateInterfaceWithReachability: internetReach];

    // Wi-Fi接続を確認
    wifiReach = [[Reachability reachabilityForLocalWiFi] retain];
    [wifiReach startNotifier];
    [self updateInterfaceWithReachability: wifiReach];
    }

    // ネットワーク接続の状態が変化したときに呼ばれる
    - (void)reachabilityChanged:(NSNotification*)note
    {
    Reachability* curReach = [note object];
    NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
    [self updateInterfaceWithReachability: curReach];
    }


    @end



    以上。

    NSLogで接続状況ログが表示されるだけの、特に何もないアプリだけど完成。

    アラート処理させたい場合、コードの「~ is failed.」処理のところにアラート処理を書けばOK.



    実際に使ってみた。


    1.ホスト接続、3G回線、Wi-Fi接続の全て接続できてる様子
    成長の果実-reachability02

            自分のPCの回線を切断する(Wi-FiをOFFにするとか)

    2.ホスト接続、3G回線、Wi-Fi接続の全てでFailedが発生!!
    成長の果実-reachability03


    リアルタイムに接続状況を確認してくれるので便利♪

    また自分のPCの回線を接続したら、「~ is successful.」と表示されるようになることを確認。


    基本的な実装はこんな感じ。

    どう使うかは、あとは自分好みにカスタマイズしていってねん。


    ----------
    サンプルソース:https://github.com/tetsuco/SampleReachability