確認したいことは、通信対象のホスト(www.google.comとか)に接続できるか、3G回線は繋がっているか、Wi-Fiは繋がっているか。
当然、ホストに接続できない場合はサーバーとかがダウンしている可能性があるのでアラート処理なんかをさせたいし、3G回線とWi-Fiの両方が接続されていない、つまり圏外のときもアラート処理させたりしたい。
上記を実現するに当たり、Appleのサンプルコードに Reachability という大変便利なクラスがあるので、それを使わせてもらう。本当にありがたい。
Reachability
http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html
上記サイトからサンプルコードをダンロードして、その中にある下記のファイルを自分のプロジェクトに追加する。
あと、SystemConfiguration.framework というフレームワークが必要なので、これも追加する。
SystemConfiguration.framework はiOS4に含まれているので普通に追加すればOK.
追加したあとはこんな感じになる。
準備は整ったので、処理を実行させたいビューに処理を書いていく。
今回はアプリ起動時に最初に呼び出される 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接続の全て接続できてる様子
↓ 自分のPCの回線を切断する(Wi-FiをOFFにするとか)
2.ホスト接続、3G回線、Wi-Fi接続の全てでFailedが発生!!
リアルタイムに接続状況を確認してくれるので便利♪
また自分のPCの回線を接続したら、「~ is successful.」と表示されるようになることを確認。
基本的な実装はこんな感じ。
どう使うかは、あとは自分好みにカスタマイズしていってねん。
----------
サンプルソース:https://github.com/tetsuco/SampleReachability