ネット接続を事前に確認する

2010/08/03

ネットワークプログラムを作る場合は、事前のネットワークの確認は必須ですね。 と言うのも先日、社内でデモしようと思ったらアプリが動かない・・・

バグか?と思ったら、

単にWebテストサーバ(自分のWindows)がスリープしてたw

という訳で、Apple DeveloperサイトにReachabilityっていうサンプルコードがあるみたい。

Reachabilityのダウンロード

Apple Developer > Reachability

Reachabilityの参考ページ

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

で、やってみたけど動作が怪しかったので、NSURLConnectionを直接使って実装してみることにした。

NSURLConnectionの参考ページ

NSURLConnection (非同期)NSURLConnectionを使ってサーバーからデータを受信する

非同期通信のサンプルコード

NSURLConnectionに非同期通信用のdelegateメソッドが用意されているので実装する。

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSLog(@"----didReceiveData----");

}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"----connectionDidFinishLoading----");
}

-(void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error{  
    NSLog(@"----Connection failed! Error - %@ %d %@----",  
          [error domain],  
          [error code],  
          [error localizedDescription]);  
    UIAlertView *alert = [[UIAlertView alloc] 
                          initWithTitle:@"ネットワークエラー"
                          message:@"サーバに接続できません"
                          delegate:self
                          cancelButtonTitle:@"閉じる"
                          otherButtonTitles:nil
                          ];
    [alert show];
    [alert release];
    
    if([error code] ==  NSURLErrorNotConnectedToInternet){
        return;  
    }  
} 

NSURLErrorNotConnectedToInternetでiPhone自体がネットワーク自体に接続しているかもチェックできる。

ネットワークチェックのメイン処理を実装する。

-(BOOL)checkNetwork:(NSString *)host {
    NSLog(@"---checkNetwork---");
    NSURLRequest *reqest = [NSURLRequest requestWithURL:[NSURL URLWithString:host]
                                            cachePolicy:NSURLRequestUseProtocolCachePolicy
                                        timeoutInterval:60.0];
    
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:reqest delegate:self];
    if (connection) {
        NSLog(@"Success");
        return YES;
    } else {
        NSLog(@"Error");
        return NO;
    }
}

とりあえず同期処理で作成してみたが、非同期通信をする場合はdidReceiveDataに処理を書く感じになるのかな?

Reachabilityは時間空いた時に調査かな??