方法一:
1.在AppDelegate的聲明文件中增加網(wǎng)絡(luò)狀態(tài)屬性:
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (nonatomic, assign, readonly) ReachabilityStatus networkStatus;
@end
2.在AppDelegate的實(shí)現(xiàn)文件中使用RAC監(jiān)聽綁定網(wǎng)絡(luò)狀態(tài):
- (void)configNetworkStatus {
[GLobalRealReachability startNotifier];
RAC(self,networkStatus) = [[[[[NSNotificationCenter defaultCenter] rac_addObserverForName: kRealReachabilityChangedNotification object: nil] map:^id(NSNotification *notif) {
return @([notif.object currentReachabilityStatus]);
}] startWith: @([GLobalRealReachability currentReachabilityStatus])] distinctUntilChanged];
}
方法二:
+ (BOOL)isConnectedToNetwork
{
// 創(chuàng)建零地址,0.0.0.0的地址表示查詢本機(jī)的網(wǎng)絡(luò)連接狀態(tài)
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
/**
* SCNetworkReachabilityRef: 用來(lái)保存創(chuàng)建測(cè)試連接返回的引用
*
* SCNetworkReachabilityCreateWithAddress: 根據(jù)傳入的地址測(cè)試連接.
* 第一個(gè)參數(shù)可以為NULL或kCFAllocatorDefault
* 第二個(gè)參數(shù)為需要測(cè)試連接的IP地址,當(dāng)為0.0.0.0時(shí)則可以查詢本機(jī)的網(wǎng)絡(luò)連接狀態(tài).
* 同時(shí)返回一個(gè)引用必須在用完后釋放.
* PS: SCNetworkReachabilityCreateWithName: 這個(gè)是根據(jù)傳入的網(wǎng)址測(cè)試連接,
* 第二個(gè)參數(shù)比如為"www.apple.com",其他和上一個(gè)一樣.
*
* SCNetworkReachabilityGetFlags: 這個(gè)函數(shù)用來(lái)獲得測(cè)試連接的狀態(tài),
* 第一個(gè)參數(shù)為之前建立的測(cè)試連接的引用,
* 第二個(gè)參數(shù)用來(lái)保存獲得的狀態(tài),
* 如果能獲得狀態(tài)則返回TRUE,否則返回FALSE
*
*/
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
SCNetworkReachabilityFlags flags;
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
if (!didRetrieveFlags)
{
printf("Error. Could not recover network reachability flagsn");
return NO;
}
/**
* kSCNetworkReachabilityFlagsReachable: 能夠連接網(wǎng)絡(luò)
* kSCNetworkReachabilityFlagsConnectionRequired: 能夠連接網(wǎng)絡(luò),但是首先得建立連接過(guò)程
* kSCNetworkReachabilityFlagsIsWWAN: 判斷是否通過(guò)蜂窩網(wǎng)覆蓋的連接,
* 比如EDGE,GPRS或者目前的3G.主要是區(qū)別通過(guò)WiFi的連接.
*
*/
BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
return (isReachable && !needsConnection) ? YES : NO;
}