V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
vanemu
V2EX  ›  iDev

iOS 下不用私有 API,有办法判断 2G 和 3G 网络么?

  •  
  •   vanemu · 2013-03-25 22:47:01 +08:00 · 9014 次点击
    这是一个创建于 4252 天前的主题,其中的信息可能已经有所发展或是发生改变。
    或者说,有什么靠谱的方法可以知道当前的网络质量?
    14 条回复    1970-01-01 08:00:00 +08:00
    loveminds
        1
    loveminds  
       2013-03-26 00:53:29 +08:00
    是否可以通过下载一定数据进行测速的方式(当然,这很耗流量)
    chemhack
        2
    chemhack  
       2013-03-26 01:44:28 +08:00
    截图然后看图标?
    txx
        3
    txx  
       2013-03-26 05:02:16 +08:00
    @chemhack 碰上越狱乱改的就无解了...
    弄个数据包测一下就好吧...2g和3g的网速都不是一个数量级的
    chemhack
        4
    chemhack  
       2013-03-26 05:05:21 +08:00
    @txx 这个比看图标还不可靠吧。。。
    txx
        5
    txx  
       2013-03-26 05:10:20 +08:00
    @chemhack lz的目的是判断网络质量而不是3g 2g嘛....
    shellcodecow
        6
    shellcodecow  
       2013-03-26 10:57:52 +08:00   ❤️ 1
    中国的iphone网络是区分2G和3G,要想获取当前的网络状态一直没有一个好的方法,网上给的例子也不尽让人满意
    最近闲来无事,仔细的研究Apple提供的例子:Reachability
    通过如下的代码:

    ?
    1
    2
    3
    Reachability *reach = [Reachability reachabilityWithHostName:@"www.apple.com"];
    NSLog(@"%d", [reach currentReachabilityStatus]);
    return;

    在currentReachabilityStatus函数中,我们注意到这样的输出:

    static void PrintReachabilityFlags(SCNetworkReachabilityFlags flags, const char* comment)
    {
    #if kShouldPrintReachabilityFlags

    NSLog(@"Reachability Flag Status: %c%c %c%c%c%c%c%c%c %s\n",
    (flags & kSCNetworkReachabilityFlagsIsWWAN) ? 'W' : '-',
    (flags & kSCNetworkReachabilityFlagsReachable) ? 'R' : '-',

    (flags & kSCNetworkReachabilityFlagsTransientConnection) ? 't' : '-',
    (flags & kSCNetworkReachabilityFlagsConnectionRequired) ? 'c' : '-',
    (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) ? 'C' : '-',
    (flags & kSCNetworkReachabilityFlagsInterventionRequired) ? 'i' : '-',
    (flags & kSCNetworkReachabilityFlagsConnectionOnDemand) ? 'D' : '-',
    (flags & kSCNetworkReachabilityFlagsIsLocalAddress) ? 'l' : '-',
    (flags & kSCNetworkReachabilityFlagsIsDirect) ? 'd' : '-',
    comment
    );
    #endif
    }
    当是wifi的时候输出R
    当是3G的时候输出Rt
    当是联通2G或者是移动的时候输出Rtc
    在头文件定义如下:
    ?
    1
    2
    3
    4
    5
    6
    typedef enum {
    NotReachable = 0,
    ReachableViaWiFi,
    ReachableVia3G,
    ReachableVia2G,//当前无法区分是联通的2G还是移动的2G
    } NetworkStatus;


    因此我就是以这个为判断条件的,重写Reachability的函数:
    - (NetworkStatus) networkStatusForFlags: (SCNetworkReachabilityFlags) flags
    {
    if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
    {
    return NotReachable;
    }


    BOOL retVal = NotReachable;

    if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
    {
    // if target host is reachable and no connection is required
    // then we'll assume (for now) that your on Wi-Fi
    retVal = ReachableViaWiFi;
    }


    if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
    (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
    {
    // ... and the connection is on-demand (or on-traffic) if the
    // calling application is using the CFSocketStream or higher APIs
    if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
    {
    // ... and no [user] intervention is needed
    retVal = ReachableViaWiFi;
    }
    }

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
    {
    retVal = ReachableVia3G;
    if((flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable) {
    if((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {
    retVal = ReachableVia2G;
    }
    }
    }

    return retVal;
    }


    这样就可以正确的区分是2G,3G,wifi网络,这只支持中国地区,其他地区未考虑。
    作者:Rush.D.Xzj
    shellcodecow
        7
    shellcodecow  
       2013-03-26 10:58:25 +08:00
    好吧 我复制黏贴了 请自行补脑。Sorry
    hilenlai
        8
    hilenlai  
       2013-03-26 21:59:21 +08:00
    bang590
        9
    bang590  
       2013-03-26 22:08:59 +08:00
    测速
    loveminds
        10
    loveminds  
       2013-03-27 04:05:07 +08:00
    @shellcodecow 3G还分电信联通两家呢~这个范例4G(LTE)输出什么?R么?
    shellcodecow
        11
    shellcodecow  
       2013-03-27 10:03:18 +08:00
    @loveminds 4G我就不知道了,你要实现看目的是什么了。我个人想的是一个软件只要分清2G/3G应该就可以了吧。
    darcy
        12
    darcy  
       2013-03-27 12:04:45 +08:00 via iPhone
    木有可靠方法的
    cloudream
        13
    cloudream  
       2013-03-27 12:30:04 +08:00
    让用户自己选择自己的网络最靠谱,默认2G,用3g的自己会打开 LOL
    yuhe520521
        14
    yuhe520521  
       2013-11-27 15:38:49 +08:00
    @cloudream 你难道不知道公司有一个部门叫做 用户体验设计部门么 你说 让用户自己选 就用户自己选的话 你让他们吃什么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2618 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:53 · PVG 23:53 · LAX 07:53 · JFK 10:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.