YYReachability的学习

作者: _阿南_ | 来源:发表于2017-09-25 19:46 被阅读70次
图片来源网络

看了YYReachability的代码,学习了几点记录下,与大家分享。

WWAN的分类

一直在说的2G,3G,4G网络,看了代码后才知道,原来移动网络的分类是根据频率来分的:

typedef NS_ENUM(NSUInteger, YYReachabilityWWANStatus) {
    YYReachabilityWWANStatusNone  = 0, ///< Not Reachable vis WWAN
    YYReachabilityWWANStatus2G = 2, ///< Reachable via 2G (GPRS/EDGE)       10~100Kbps
    YYReachabilityWWANStatus3G = 3, ///< Reachable via 3G (WCDMA/HSDPA/...) 1~10Mbps
    YYReachabilityWWANStatus4G = 4, ///< Reachable via 4G (eHRPD/LTE)       100Mbps
};

苹果官方提供的网络分类:

dic = @{CTRadioAccessTechnologyGPRS : @(YYReachabilityWWANStatus2G),  // 2.5G   171Kbps
                CTRadioAccessTechnologyEdge : @(YYReachabilityWWANStatus2G),  // 2.75G  384Kbps
                CTRadioAccessTechnologyWCDMA : @(YYReachabilityWWANStatus3G), // 3G     3.6Mbps/384Kbps
                CTRadioAccessTechnologyHSDPA : @(YYReachabilityWWANStatus3G), // 3.5G   14.4Mbps/384Kbps
                CTRadioAccessTechnologyHSUPA : @(YYReachabilityWWANStatus3G), // 3.75G  14.4Mbps/5.76Mbps
                CTRadioAccessTechnologyCDMA1x : @(YYReachabilityWWANStatus3G), // 2.5G
                CTRadioAccessTechnologyCDMAEVDORev0 : @(YYReachabilityWWANStatus3G),
                CTRadioAccessTechnologyCDMAEVDORevA : @(YYReachabilityWWANStatus3G),
                CTRadioAccessTechnologyCDMAEVDORevB : @(YYReachabilityWWANStatus3G),
                CTRadioAccessTechnologyeHRPD : @(YYReachabilityWWANStatus3G),
                CTRadioAccessTechnologyLTE : @(YYReachabilityWWANStatus4G)}; // LTE:3.9G 150M/75M  LTE-Advanced:4G 300M/150M

通过属性

@property (nonatomic, readonly, retain, nullable) NSString* currentRadioAccessTechnology __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);

返回。

网络监控

针对网络改变的主要代码是:

SCNetworkReachabilityContext context = { 0, (__bridge void *)self, NULL, NULL, NULL };
SCNetworkReachabilitySetCallback(self.ref, YYReachabilityCallback, &context);
SCNetworkReachabilitySetDispatchQueue(self.ref, [self.class sharedQueue]);

使用回调方法来通知网络的变化。

静态方法

使用了C语言的静态函数来传递函数指针。

SCNetworkReachabilitySetCallback(self.ref, YYReachabilityCallback, &context);

YYReachabilityCallback为申明的静态函数

static void YYReachabilityCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info) {
    YYReachability *self = ((__bridge YYReachability *)info);
    if (self.notifyBlock) {
        dispatch_async(dispatch_get_main_queue(), ^{
            self.notifyBlock(self);
        });
    }
}

与AFNetworking库中的AFNetworkReachabilityManager实现逻辑一致。

测试

编写了测试代码:

- (void)testReachability
{
    YYReachability *reachability = [YYReachability reachability];

    reachability.notifyBlock = ^(YYReachability *reachability){
        NSLog(@"reachability.flags is %d.", reachability.flags);
        NSLog(@"reachability.status is %lu.", (unsigned long)reachability.status);
        NSLog(@"reachability.wwanStatus is %lu.", (unsigned long)reachability.wwanStatus);
    };

    self.reachability = reachability;
}

必须申明实例变量,如果是临时编码,将不会执行block。

  • 从无网,切换到4G,
2017-09-25 19:09:46.864040+0800 RecordTechnology[12013:1154192] reachability.flags is 262147.
2017-09-25 19:09:46.864369+0800 RecordTechnology[12013:1154192] reachability.status is 1.
2017-09-25 19:09:46.864541+0800 RecordTechnology[12013:1154192] reachability.wwanStatus is 4.

切换到wifi,

2017-09-25 19:11:36.266635+0800 RecordTechnology[12013:1154192] reachability.flags is 2.
2017-09-25 19:11:36.282290+0800 RecordTechnology[12013:1154192] reachability.status is 2.
2017-09-25 19:11:36.291125+0800 RecordTechnology[12013:1154192] reachability.wwanStatus is 4.

关闭4G,不打印日志
关闭wifi。

2017-09-25 19:11:56.093725+0800 RecordTechnology[12013:1154192] reachability.flags is 0.
2017-09-25 19:11:56.094497+0800 RecordTechnology[12013:1154192] reachability.status is 0.
2017-09-25 19:11:56.094859+0800 RecordTechnology[12013:1154192] reachability.wwanStatus is 4.

网络切换显示正常。

// END

相关文章

  • YYReachability的学习

    看了YYReachability的代码,学习了几点记录下,与大家分享。 WWAN的分类 一直在说的2G,3G,4G...

  • iOS 因为用了YYReachability,App被拒了

      事先声明一下,不是黑YYKit。YYKit是一个非常优秀的第三方库,项目里很多地方都用到了。我是因为调用了下面...

  • 学习的学习

    “三分钟的热情相信大家都有,但是能够重复思考一个概念,一个知识点,并把它吃透掌握才是大部分人稀缺的能力。”李笑来老...

  • 学习的学习

    不只是学习,听完是不够的。 还要把学到的东西变成方法论、清单式的条目出来去刻意练习。去用,去不断的实践。 有个词 ...

  • 学习的真相|学习「学习」再学习

    不知不觉间,笑来老师在“好的家庭教育”讲的新课《学习的真相》,已经更新到了第12课,关于“学习的真相”这门课,我认...

  • 元学习——关于学习的学习

    元学习是一门关于如何学习的课程。 首先理清几个概念 1、学习是拼图 学习并不是线性的,相反学习是一张信息拼图,类似...

  • 学习,就是学习学习的态度!

    学习,从来都需要态度! 没有了态度,你来了,也不过是躯体入场,思想游荡! 那就学习学习的态度喽!

  • 学习学习再学习的成长

    女儿快要中考了,随着时间的临近,中考紧张气氛越来越浓。成绩一直不太理想的她,也有了紧迫感,不时表露出来“书到用时方...

  • 学习,学习的方法

    学习一门学科首先掌握这个领域的一些基础理论和概念 然后学习一些高级的组合框架,这些框架是一些能够解决这个领域通用问...

  • 08 学习的学习

    1 现代人,基本都是读书人,我们从小学,甚至是幼儿园就开始读书写字一直到大学毕业,少说也有16年,但是很多人都不知...

网友评论

    本文标题:YYReachability的学习

    本文链接:https://www.haomeiwen.com/subject/xvbdextx.html