IOS網路——檢測網路狀態:Reachability
轉自:http://www.bubuko.com/infodetail-650914.html
1.iOS平臺是按照一直有網路連線的思路來設計的,開發者利用這一特點創造了很多優秀的第三方應用。大多數的iOS應用都需要聯網,甚至有些應用嚴重依賴網路,沒有網路就無法正常工作。
2.在你的應用嘗試通過網路獲取資料之前,你需要知道當前裝置是否知道連線上了網路,甚至有時候你可能還需要知道當前網路是由wifi還是由移動蜂窩網路提供的。
3.“在網路訪問失敗的時候,應用沒有做出適當的提示”是蘋果的iOS稽核團隊拒絕一個應用的常見理由。蘋果要求你必須先檢測網路連線狀態,當網路不可用的時候以某種方式告知使用者,或者用其他優雅的方式進行處理。
***********************
Reachability類:
1.這個類用於檢測當前網路狀態,它不是SDK的一部分,可以在iOS Developer Library裡找到這份程式碼。
從蘋果網站上下載Reachability.zip檔案,解壓之。
2.重用Reachability類
(1)把Reachability.h和Reachability.m檔案拖到專案中。
(2)新增框架:SystemConfiguration.framework。
3.同步的Reachability
(1)使用同步的方式是比較簡單,匯入Reachability.h標頭檔案,然後通過程式碼檢查網路:
#import “Reachability.h”
。。。some code omitted…
Reachability *reach = [Reachability reachabilityForInternetConnection];
NetworkStatus status = [reach currentReachabilityStatus];
(2)通過檢查某個主機能否訪問來判斷當前網路是否可用:
Reachability *reach = [Reachability reachabilityWithHostName:@“www.apple.com”];
NetworkStatus status = [reach currentReachabilityStatus];
(3)案例:
建立一個工程,並新增Reachability.h和Reachability.m到工程中,並連結SystemConfiguration.framework.
在AppDelegate.h標頭檔案中匯入Reachability.h,並新增一個例項方法。如圖:
在AppDelegate.m中這樣實現:如圖:
4.非同步的Reachability
(1)非同步的方式稍微複雜,不過通過這種方式可以來訂閱實時的網路狀態變化通知。匯入Reachability.h標頭檔案,然後註冊一個物件來訂閱網路狀態變化的資訊,網路狀態變化的資訊名稱為kReachabilityChanged-Notification.如下:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(reachabilityChanged:)
name:kReachabilityChangedNotification
object:nil];
(2)你需要建立一個Reachability物件例項並開始向外釋出網路狀態變化的訊息://注意要建立一個屬性
@property (nonatomic) Reachability *internetReachability;
self.internetReachability = [ReachabilityreachabilityForInternetConnection];
[self.internetReachabilitystartNotifier];
[selfreachability:self.internetReachability];
(3)當網路狀態發生變化的時候,Reachability物件將呼叫reachabilityChanged:方法,可以在這個方法裡面獲取當前的網路狀態,然後做相應的處理。
#pragma mark - reachabilityChanged
/*!
* Called by Reachability whenever status changes.
*/
- (void) reachabilityChanged:(NSNotification *)note
{
Reachability* curReach = [note object];
NSParameterAssert([curReach isKindOfClass:[Reachability class]]);
[self reachability:curReach];
}
- (void)reachability:(Reachability *)reachability
{
NetworkStatus netStatus = [reachability currentReachabilityStatus];
BOOL connectionRequired = [reachability connectionRequired];
NSString* statusString = @"";
switch (netStatus)
{
case NotReachable: {
statusString = NSLocalizedString(@"Access Not Available", @"Text field text for access is not available");
/*
Minor interface detail- connectionRequired may return YES even when the host is unreachable. We cover that up here...
*/
connectionRequired = NO;
break;
}
case ReachableViaWWAN: {
statusString = NSLocalizedString(@"Reachable WWAN", @"");
break;
}
case ReachableViaWiFi: {
statusString= NSLocalizedString(@"Reachable WiFi", @"");
break;
}
}
if (connectionRequired)
{
NSString *connectionRequiredFormatString = NSLocalizedString(@"%@, Connection Required", @"Concatenation of status string with connection requirement");
statusString= [NSString stringWithFormat:connectionRequiredFormatString, statusString];
}
NSLog(@"connection status = [%@]",statusString);
}
5.原生 Reachability API
前面將的Reachability類實際上是蘋果公司對SCNetworkReachability API的封裝,這個API定義在SystemConfigure.framework庫中。如果有其他特別的需求,也可以直接使用這個原生的SCNetworkReachability類。