如何在APP端,让用户的联网体验更好?
最初在写网络接口时,考虑的问题比较少,最多加个延时,到了相应的时间点(如5秒,10秒),要是还不来信息,直接弹出提示:服务器无响应!!!
尼玛,一次无响应、两次无响应····n次无响应。要是老板也有这种体验,呵呵,赶快去优化。当然,这么基本的用户体验问题不能等到老板发火再处理,自己先认认真真地思考怎么解决。
优化第一招:联网前检测网络状况
苹果提供了Reachability 来检测网络状况,每次调用接口前,测试设备是否能联网:
Reachability *r = [Reachability reachabilityWithHostName:@"www.baidu.com"]; if (r.currentReachabilityStatus == NotReachable) { NSLog(@"Cannot connect server."); return; }
Reachability对性能不会产生影响,因为它只是检测网络是否连接着,不会验证是不是真正连通。
优化第二招:网络延时后检测真正地网络连接
如果想确认是否能连接到互联网,可以使用第三方的库“RealReachability“,在github上能搜到。它通过ping的方式,像服务器发起请求,来确认网络是否连通。使用类似于Reachability,由于请求网络比较耗时,它通过block返回网络信息:
[GLobalRealReachability reachabilityWithBlock:^(ReachabilityStatus status) { switch (status) { case RealStatusNotReachable: { [[[UIAlertView alloc] initWithTitle:@"RealReachability" message:@"Nothing to do! offlineMode" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil , nil] show]; break; } case RealStatusViaWiFi: { [[[UIAlertView alloc] initWithTitle:@"RealReachability" message:@"Do what you want! free!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil , nil] show]; break; } case RealStatusViaWWAN: { [[[UIAlertView alloc] initWithTitle:@"RealReachability" message:@"Take care of your money! You are in charge!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil , nil] show]; break; } default: break; } }];
在项目的接口中,请求发出后5秒还没响应,则调用该方法检测网络状况,如果有网络就重新发起请求。
在实际测试过程中发现,在有网络时检测的结果经常是NotReachabel,这严重影响实际使用。后来仔细阅读了源代码,发现检测网络的延时只有2秒(PingHelper.m),在用户网络不流畅时,2秒太短了,于是改成了4秒,检测的效果有所提升。
[strongSelf performSelector:@selector(pingTimeOut) withObject:nil afterDelay:4.0f]; [self performSelector:@selector(pingTimeOut) withObject:nil afterDelay:4.0f];
然而,这个库还存在问题。在初次检测时,直接提示NotReachabel,并没有经过4秒的等待,需要到github上提出这个问题。
时间: 2024-10-05 06:19:27