iOS网络连接优化

    如何在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上提出这个问题。


你可能感兴趣的:(iOS)