NetworkReachability相關的API
1. 構造struct sockaddr_in
struct sockaddr_in address;
bzero(&address, sizeof(address));
address.sin_len = sizeof(address);
address.sin_family = AF_INET;
2. 構造SCNetworkReachabilityRef
SCNetworkReachabilityRef networkReachability = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault, (const struct sockaddr *)address);
SCNetworkReachabilityRef networkReachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [domain UTF8String]);
3.構造SCNetworkReachabilityContext
SCNetworkReachabilityContext context = {0, (__bridge void *)callback, AFNetworkReachabilityRetainCallback, AFNetworkReachabilityReleaseCallback, NULL};
4.設置回調SCNetworkReachabilitySetCallback
SCNetworkReachabilitySetCallback((__bridge SCNetworkReachabilityRef)networkReachability, AFNetworkReachabilityCallback, &context);
5.將SCNetworkReachabilityRef加入到runloop中
SCNetworkReachabilityScheduleWithRunLoop((__bridge SCNetworkReachabilityRef)networkReachability, CFRunLoopGetMain(), kCFRunLoopCommonModes);
6.主動獲取當前的網絡狀態(tài)
SCNetworkReachabilityFlags flags;
SCNetworkReachabilityGetFlags((__bridge SCNetworkReachabilityRef
之前使用過其他的Reachability第三方庫委可,存在一些問題:
- 沒有提供主動獲取當前網絡狀態(tài)的方法访敌,進入程序后無法判斷當前網絡狀態(tài),在無網情況下無法彈出網絡不可用的提示
- 回調返回的狀態(tài)前后兩次可能是同樣的轰枝,直接導致斷網之后會不停的彈出網絡不可用的提示
問題討論
1. 以前測試網絡不可達時會提供一個domain捅彻,按照構造SCNetworkReachabilityRef的方法可以使用SCNetworkReachabilityCreateWithAddress
- 提供domain可以確定對特定domain網絡狀態(tài)的反饋,而提供一個空的sockaddr_in鞍陨,網絡的Reachability是如何判斷的
- 測試網絡Reachability的底層原理是什么
先挖坑步淹,再努力填!