Copyright (C) iPhoneアプリ開発備忘録 All rights reserved.
ブログ内で記したコード、内容の正確性は保証いたしません。
記載内容を実装したことにより発生した不具合・損害等の責任は一切負いません。



2011年06月21日

圏外通知を実装する(Reachability2.2版)



ネットワークの接続状態を監視するサンプルコードReachabilityが2.2にバージョンアップされている。

以前、紹介したReachability1.5使用時の圏外通知との機能差異は、ホスト(特定のドメイン)接続状態を監視する機能に加えて、3Gネットワーク、WiFiの接続状態監視、デバイスがネットワークに接続できる状態になっているかなどの機能が追加されている。

Reachability2.2のサンプルコードを基本的には流用できるが、iOS4.3.3において、アプリケーションの起動直後にホスト接続状態の監視機能を働かせると、ホストとの接続が確立されている状況においても、なぜか「接続されていない」というステータスが返される。
2回目以降の接続状態チェックにおいては正しく動作する。(Reachability2.2側の不具合かどうかは未検証)

このため、Reachability2.2をそのまま使用する場合、サンプルコードを一部修正した上でAppDelegateに取り込む必要がある。

以下は、Reachability1.5を利用していたときと同様に、ネットワーク接続が確立されているかのみ(ホスト接続状態の監視のみ)をチェックする機能のコーディング。

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

@class HogeViewController;
@class Reachability;

@interface HogeAppDelegate : NSObject <UIApplicationDelegate> {

Reachability* hostReach;
Reachability* internetReach;
Reachability* wifiReach;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet HogeViewController *viewController;

@end

HogeAppDelegate.m
#import "HogeAppDelegate.h"
#import "HogeViewController.h"
#import "Reachability.h"

@implementation HogeAppDelegate

@synthesize window;
@synthesize viewController;

// 接続状態をチェックする
- (void) updateInterfaceWithReachability: (Reachability*) curReach
{
NetworkStatus netStatus = [curReach currentReachabilityStatus];

if(curReach == hostReach) {
if( netStatus == NotReachable ) { // 未接続
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"error" message:@"Do not connect network."
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
[alert release];
}
}

}

// 接続状態が変化したら呼ばれる
- (void) reachabilityChanged: (NSNotification* )note
{
Reachability* curReach = [note object];
NSParameterAssert([curReach isKindOfClass: [Reachability class]]);

[self updateInterfaceWithReachability: curReach];
}


// アプリ起動時
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil];

//ホスト接続のチェック
hostReach = [[Reachability reachabilityWithHostName: @"www.yahoo.co.jp"] retain];
[hostReach startNotifier];
// [self updateInterfaceWithReachability: hostReach]; // ← Reachability2.2のサンプルコードではこれが実行されるがために、ホスト接続されている場合においても、updateInterfaceWithReachabilityで未接続(NotReachable)となる。このため、このコードはコメントアウトする。

// 3Gネットワーク接続のチェック
internetReach = [[Reachability reachabilityForInternetConnection] retain];
[internetReach startNotifier];
[self updateInterfaceWithReachability: internetReach];

// WiFi接続のチェック
wifiReach = [[Reachability reachabilityForLocalWiFi] retain];
[wifiReach startNotifier];
[self updateInterfaceWithReachability: wifiReach];


[self.window addSubview:viewController.view];
[self.window makeKeyAndVisible];
return YES;
}

- (void)dealloc {
[window release]; window = nil;
[viewController release]; viewController = nil;
[super dealloc];
}

@end
タグ:iPhone
【ネットワーク圏外通知の最新記事】
posted by mobileDeveloper at 16:38 | Comment(0) | TrackBack(0) | ネットワーク圏外通知 はてなブックマーク - 圏外通知を実装する(Reachability2.2版) | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
Apple、Appleのロゴ、App Store、iPodのロゴ、iTunesは、米国および他国のApple Inc.の登録商標です。
iPhone、iPod touch、iPadはApple Inc.の商標です。
iPhone商標は、アイホン株式会社のライセンスに基づき使用されています。
その他、本ブログに記載されている製品名、会社名は、それぞれ各社の商標または登録商標です。