RSS

iPhone Reachability ネットワーク接続を確認する

iPhoneアプリ内でネットワーク(3Gネットワーク,Wi-Fi)を確認する方法を検索したら,古いものしか見つからなかった(接続確認に利用するAppleのサンプルプログラムがバージョンアップした)ので,現バージョンに対応したメモのまとめ.公開プログラムを眺めれば,使い方は分かりますが,自分用に必要なものだけをピックアップ.

AppleのサンプルプログラムReachability(Version: 2.0)をダウンロード(Apple IDでログインする)して,自分のプロジェクトにReachability.hとReachability.mを追加する.忘れずにフレームワークにSystemConfigurationを追加する.

まず,自分のヘッダーファイル内で宣言する
#import <uikit/uikit.h>

@class Reachability;

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

@end

メソッドファイル内でReachabilityの設定と処理用メソッドを書く.設定は,viewDidLoad,viewWillAppearやネットワークを行う直前などで,書く.
#import "Reachability.h"

// Reachabilityの状態により,確認処理を行う
- (void) updateInterfaceWithReachability: (Reachability*) curReach
{

// 接続の状態を取得する.戻り値は,以下の3つ
// NotReachable
// ReachableViaWiFi
// ReachableViaWWAN
NetworkStatus status = [curReach currentReachabilityStatus];

// ホスト接続の場合
if(curReach == hostReach)
{
if( status == NotReachable ) NSLog(@"host failed");
}

// 3Gネットワーク接続の場合
if(curReach == internetReach)
{
if( status == NotReachable ) NSLog(@"3G failed");
}

// Wi-Fi接続の場合
if(curReach == wifiReach)
{
if( status == NotReachable ) NSLog(@"Wi-Fi failed");
}

- (void)viewDidLoad
{
[super viewDidLoad];

// ホスト(例えば,www.google.com)接続を調べる
hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];
[self updateInterfaceWithReachability: hostReach];

// 3Gネットワーク接続を調べる
internetReach = [[Reachability reachabilityForInternetConnection] retain];
[self updateInterfaceWithReachability: internetReach];

// Wi-Fi接続を調べる
wifiReach = [[Reachability reachabilityForLocalWiFi] retain];
[self updateInterfaceWithReachability: wifiReach];

}

ここで,ネットワーク接続の状態が変わった場合でも検知したい場合は,状態変化を検出するように設定して,その変化時に処理を行うメソッドを定義する.
// ネットワーク接続の状態が変化したときに,呼ばれるメソッド
- (void) reachabilityChanged: (NSNotification* )note
{
Reachability* curReach = [note object];
NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
[self updateInterfaceWithReachability: curReach];
}

- (void)viewDidLoad
{
[super viewDidLoad];

// ネットワーク接続を観測して変化したときに,呼ばれるメソッドを設定する
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:)
name: kReachabilityChangedNotification
object: nil];

// ホスト(例えば,www.google.com)接続を調べる
hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];
[hostReach startNotifer];
}

これのサンプルソースです.プログでは見にくいので,興味ある人は直接プロジェクトを確認してください.使用条件は自己責任です.このサンプルをアプリに参考・組込する/した方は,得した分だけ隣人にジュースを奢ってあげてください.3G専用やWi-Fi専用アプリを作らない限り,hostReachだけを使えばネットワークを確認できまる.

追記
iOS5.0からのARCに対応させるにはReachability.m/hの一部を書き換える必要があります.ARCの知識を持っているか,プログラマの力量を確かめられる良い機会です.

Bookmark and Share

0 コメント: