
圖片來源網(wǎng)絡
看了YYReachability的代碼,學習了幾點記錄下,與大家分享。
WWAN的分類
一直在說的2G,3G,4G網(wǎng)絡,看了代碼后才知道,原來移動網(wǎng)絡的分類是根據(jù)頻率來分的:
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
};
蘋果官方提供的網(wǎng)絡分類:
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);
返回。
網(wǎng)絡監(jiān)控
針對網(wǎng)絡改變的主要代碼是:
SCNetworkReachabilityContext context = { 0, (__bridge void *)self, NULL, NULL, NULL };
SCNetworkReachabilitySetCallback(self.ref, YYReachabilityCallback, &context);
SCNetworkReachabilitySetDispatchQueue(self.ref, [self.class sharedQueue]);
使用回調方法來通知網(wǎng)絡的變化。
靜態(tài)方法
使用了C語言的靜態(tài)函數(shù)來傳遞函數(shù)指針。
SCNetworkReachabilitySetCallback(self.ref, YYReachabilityCallback, &context);
YYReachabilityCallback為申明的靜態(tài)函數(shù)
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實現(xiàn)邏輯一致。
測試
編寫了測試代碼:
- (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;
}
必須申明實例變量,如果是臨時編碼,將不會執(zhí)行block。
- 從無網(wǎng),切換到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.
網(wǎng)絡切換顯示正常。
// END