ネットワークプログラムを作る場合は、事前のネットワークの確認は必須ですね。 と言うのも先日、社内でデモしようと思ったらアプリが動かない・・・
バグか?と思ったら、
単にWebテストサーバ(自分のWindows)がスリープしてたw
という訳で、Apple DeveloperサイトにReachabilityっていうサンプルコードがあるみたい。
Apple Developer > Reachability
・iPhone Reachability ネットワーク接続を確認する
で、やってみたけど動作が怪しかったので、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は時間空いた時に調査かな??