方法一:
1.在AppDelegate的聲明文件中增加網(wǎng)絡(luò)狀態(tài)屬性:
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (nonatomic, assign, readonly) ReachabilityStatus networkStatus;
@end
2.在AppDelegate的實現(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: 用來保存創(chuàng)建測試連接返回的引用
*
* SCNetworkReachabilityCreateWithAddress: 根據(jù)傳入的地址測試連接.
* 第一個參數(shù)可以為NULL或kCFAllocatorDefault
* 第二個參數(shù)為需要測試連接的IP地址,當(dāng)為0.0.0.0時則可以查詢本機(jī)的網(wǎng)絡(luò)連接狀態(tài).
* 同時返回一個引用必須在用完后釋放.
* PS: SCNetworkReachabilityCreateWithName: 這個是根據(jù)傳入的網(wǎng)址測試連接,
* 第二個參數(shù)比如為"www.apple.com",其他和上一個一樣.
*
* SCNetworkReachabilityGetFlags: 這個函數(shù)用來獲得測試連接的狀態(tài),
* 第一個參數(shù)為之前建立的測試連接的引用,
* 第二個參數(shù)用來保存獲得的狀態(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ò),但是首先得建立連接過程
* kSCNetworkReachabilityFlagsIsWWAN: 判斷是否通過蜂窩網(wǎng)覆蓋的連接,
* 比如EDGE,GPRS或者目前的3G.主要是區(qū)別通過WiFi的連接.
*
*/
BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
return (isReachable && !needsConnection) ? YES : NO;
}