Reachability 检查网络状态
Reachability是苹果官方给的检查网络状态的库,想必每个基于网络的应用都会用它来检查网络状态吧,当然笔者也不例外.可是正当自信满满的我,用这个库用的不亦乐乎的时候,突然发现我写的基于网络的程序工作的不是那么流畅了,尤其是仔细检查以后确定是因为用了Reachability的时候,一下子觉得的不可理喻,这瞬间的落差让前一分钟还在美滋滋的认为”写程序是艺术,用程序是享受”的我情何以堪?
这种情况就是:连接到了Wifi,但是并不能上网.这时候用Reachability检查会认为设备处在wifi情况下(没错,好像就是wifi环境下),如果这时候你相当然的认为可以正常上网而去获取网络数据的话你就等待网络请求超时吧,而默认的超时时间似乎有15秒之久,程序卡住这么久在用户体验上不可接受的.以前的时候一直觉得Reachability挺神奇的,可以检查出来是wifi还是3G网络,还暗自想它是不是偷偷的连接到了哪台服务器判断网络情况,这次仔细看了下,觉得挺失败的,它区分网络连接的时候只是简单的查看有没有ip地址,哎.这就难怪出现以为是wifi但是上不了网的情况了.解决办法呢?如果是用ASI进行http请求的话,可以简单设置一下超时时间可以在一定程度上避开这个问题:[request setTimeOutSeconds:5];如果是用的NSURLRequest的话,可以用忽略本地缓存并增加超时的方法:NSURLRequest *request = [NSURLRequest requestWithURL:url1 cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10];研究到这里,笔者突然觉得发现了一个判断网络连接的办法:
NSURL *url1 = [NSURL URLWithString:@"http://blog.cnrainbird.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:url1 cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10];
NSHTTPURLResponse *response;
[NSURLConnection sendSynchronousRequest:request returningResponse: &response error: nil];
if (response == nil) {
NSLog(@"没有网络");
}
else{
NSLog(@"网络是通的");
}
简单来说就是进行一个网络请示并设置一下超时时间,然后根据返回结果判断网络连接.当然了你的网络请求最好是返回很简单的数据,请求地址最好也是你将要请求的网络地址(你想想:你要请求baidu的东西,判断google的网络连接性有用么?).友情提示一下,上面一段代码搁在主线程里用依然会卡住界面的哟.
仔细想来Reachability并没有错.错就错在我把用来判断网络连接类型的东西用来判断网络连通性.所以合理的利用工具,做正确的事:)转自Rainbird的个人博客
使用Reachability实时检测网络连接状况
//在程序的启动处,开启通知
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//.....
//开启网络状况的监听
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name: kReachabilityChangedNotification
object: nil];
hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain];//可以以多种形式初始化
[hostReach startNotifier]; //开始监听,会启动一个run loop
[self updateInte易做图ceWithReachability: hostReach];
//.....
}
// 连接改变
- (void) reachabilityChanged: (NSNotification* )note
{
Reachability* curReach = [note object];
NSParameterAssert([curReach isKindOfClass: [Reachability class]]);
[self updateInte易做图ceWithReachability: curReach];
}
//处理连接改变后的情况
- (void) updateInte易做图ceWithReachability: (Reachability*) curReach
{
//对连接改变做出响应的处理动作。
NetworkStatus status = [curReach currentReachabilityStatus];
if (status == NotReachable) { //没有连接到网络就弹出提实况
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"My App Name"
message:@"NotReachable"
delegate:nil
cancelButtonTitle:@"YES" otherButtonTitles:nil];
[alert show];
[alert release];
}
}
补充:移动开发 , IOS ,