[iOS] ネットワーク接続状況取得ライブラリを公開

2011年5月25日水曜日 | Published in | 2 コメント

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

ネットワークの接続状況を取得できるライブラリを公開しました。
dev5tec/FBNetworkReachability - GitHub


特徴


現在の接続状況(WiFi, 3Gなど)を取得することができる。

以下、使い方の例
FBNetworkReachability* network =
    [FBNetworkReachability networkReachabilityWithHostname:@"http://xcatsan.com/"];

FBNetworkReachabilityConnectionMode mode = network.connectionMode;
switch (mode) {
    case FBNetworkReachableNon:
        // 未接続
        break;

    case FBNetworkReachableWiFi:
        // WiFi接続
        break;

    case FBNetworkReachableWWAN:
        // 3G接続
        break;
}
if(network.reachable) {
    // 接続時処理
}

NSLog(@"ip: %@", network.ipaddress);  // IPアドレス

接続状況が変化した時には FBNetworkReachabilityDidChangeNotification をポストするので、この変化をトリガーにして非同期的な処理を書くこともできる。
[[NSNotificationCenter defaultCenter]
             addObserver:self
             selector:@selector(didChangeNetworkReachability:)
             name:FBNetworkReachabilityDidChangeNotification
             object:nil];

- (void)didChangeNetworkReachability:(NSNotification*)notification
{
    FBNetworkReachabiity* network = [notification object];
        :
}

その他の特徴は以下のとおり。

  • バックグラウンド動作は行わない。
  • バックグラウンドからフォアグラウンドに変わる間に変化があった場合は最新のイベントがポストされる。
  • 内部的にはURL毎にインスタンスが共有される(例えば URLを "http://xcatsan.com" として3回インスタンスを取得した場合、いずれも同じインスタンスが返る)。
  • 到達不可能なURLは使えない。URLは名前解決できてIP的に到達可能である必要がある。
  • スレッドセーフ



インストール


ソースコードの追加およびフレームワークの追加が必要。

ソースコード追加

GitHubからプロジェクトをダウンロードした後 Xcode 4 で開き、その中から下記のファイルを自分のプロジェクトへコピーして追加する。
FBNetworkReachability.h
FBNetworkReachability.m

フレームワーク追加

SystemConfiguration.framework を追加する。



ソース解説


解説は過去のブログが詳しいのでそちらを参照のこと。

Cocoaの日々: ネットワーク接続状況を知る

Cocoaの日々: ネットワーク接続状況を知る[2] SCNetworkReachabilityGetFlags はブロックする

以前ブログで紹介したバージョンではインスタンス作成直後に connectionModeを取得すると必ず未初期化状態(FBNetworkReachableUninitialization)となっていた。これだと実用上はいろいろと困るので、未初期化状態の場合は「0.5秒待つ」処理を加えた。こんな感じ。

- (FBNetworkReachabilityConnectionMode)connectionMode
{
    FBNetworkReachabilityConnectionMode mode;
    @synchronized (self) {
        mode = connectionMode_;
    }
    if (mode == FBNetworkReachableUninitialization) {
        [[NSRunLoop currentRunLoop]
         runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
    }
    return connectionMode_;
}
SCNetworkReachability における非同期処理(コールバック)はランループを使っている。接続状況変化のイベントはランループを介して SCNetworkRechability へ届くので、sleep でスレッドを止めるのではなく、runUntileDate: を使ってその場でランループの処理だけを回してやる。大抵はこの 0.5秒間の間にイベントが届き、コールバックが呼び出され、connectionMode が FBNetworkReachableUninitialization 以外になる。これによってインスタンス作成直後であっても有効な connectionMode が得られる。

(2011-11-14追記)
Cocoaの日々: [iOS] SCNetworkReachabilityGetFlags のブロックの件
上記で記事で解説したように遅延は解消されたので最新版では「0.5秒待つ」処理は入っていない。


動作確認用アプリケーション


GitHub のプロジェクトには動作確認用のアプリケーションが付属している。
接続方式に変化があるとテーブルが更新される。



カスタマイズ


特になし。強いて言えばソース解説で説明した初回の待ち時間(0.5秒)。これはソースコードを直接書き換える。



ライセンス


MIT ライセンスで、商用・非商用を問わず利用可能。カスタマイズして再配布も自由。連絡も不要。



関連情報


なし

Responses

  1. 匿名
    2012年1月24日 22:58

    はじめまして、ありがたく使わせていただいております。
    githubのUsage(4) Using notificationの、
    [FBNetworkReachability startNotifier];

    [[FBNetworkReachability sharedInstance] startNotifier];
    ではないでしょうか。

  2. 匿名
    2012年1月24日 22:58

    はじめまして、ありがたく使わせていただいております。
    githubのUsage(4) Using notificationの、
    [FBNetworkReachability startNotifier];

    [[FBNetworkReachability sharedInstance] startNotifier];
    ではないでしょうか。

  3. xcatsan says:
    2012年1月31日 23:10

    こんばんは。
    指摘の通りですね。
    先ほど直しておきました。

    ありがとうございました。
    では。

  4. xcatsan says:
    2012年1月31日 23:10

    こんばんは。
    指摘の通りですね。
    先ほど直しておきました。

    ありがとうございました。
    では。

Leave a Response

人気の投稿(過去 30日間)