一:確認網路環境3G/WIFI
1. 添加源檔案和framework 開發Web等網路應用程式的時候,需要確認網路環境,串連情況等資訊。如果沒有處理它們,是不會通過Apple的審(我們的)查的。 Apple 的 常式 Reachability 中介紹了取得/檢測網路狀態的方法。要在應用程式程式中使用Reachability,首先要完成如下兩部: 1.1. 添加源檔案: 在你的程式中使用 Reachability 只須將該常式中的 Reachability.h 和 Reachability.m 拷貝到你的工程中。Reachability的h和m檔案可以在這裡下載:https://github.com/tonymillion/Reachability/blob/master/Reachability.h(支援ARC和GCD) 1.2.添加framework: 將SystemConfiguration.framework 添加進工程。如: 2. 網路狀態 Reachability.h中定義了三種網路狀態: typedef enum { NotReachable = 0, //無串連 ReachableViaWiFi, //使用3G/GPRS網路 ReachableViaWWAN //使用WiFi網路 } NetworkStatus; 因此可以這樣檢查網路狀態: Reachability *r = [Reachability reachabilityWithHostName:@“www.apple.com”]; switch ([r currentReachabilityStatus]) { case NotReachable: // 沒有網路連接 break; case ReachableViaWWAN: // 使用3G網路 break; case ReachableViaWiFi: // 使用WiFi網路 break; } 3.檢查當前網路環境 程式啟動時,如果想檢測可用的網路環境,可以像這樣 // 是否wifi + (BOOL) IsEnableWIFI { return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable); } // 是否3G + (BOOL) IsEnable3G { return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable); } 例子: - (void)viewWillAppear:(BOOL)animated { if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) && ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) { self.navigationItem.hidesBackButton = YES; [self.navigationItem setLeftBarButtonItem:nil animated:NO]; } } 4. 連結狀態的即時通知 網路連接狀態的即時檢查,通知在網路應用中也是十分必要的。接續狀態發生變化時,需要及時地通知使用者: Reachability 1.5版本 // My.AppDelegate.h #import "Reachability.h" @interface MyAppDelegate : NSObject <UIApplicationDelegate> { NetworkStatus remoteHostStatus; } @property NetworkStatus remoteHostStatus; @end // My.AppDelegate.m #import "MyAppDelegate.h" @implementation MyAppDelegate @synthesize remoteHostStatus; // 更新網路狀態 - (void)updateStatus { self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus]; } // 通知網路狀態 - (void)reachabilityChanged:(NSNotification *)note { [self updateStatus]; if (self.remoteHostStatus == NotReachable) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil) message:NSLocalizedString (@"NotReachable", nil) delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; [alert show]; [alert release]; } } // 程式啟動器,啟動網路監視 - (void)applicationDidFinishLaunching:(UIApplication *)application { // 設定網路檢測的網站 [[Reachability sharedReachability] setHostName:@"www.apple.com"]; [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES]; // 設定網路狀態變化時的通知函數 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:@"kNetworkReachabilityChangedNotification" object:nil]; [self updateStatus]; } - (void)dealloc { // 刪除通知對象 [[NSNotificationCenter defaultCenter] removeObserver:self]; [window release]; [super dealloc]; } Reachability 2.0版本 // MyAppDelegate.h @class Reachability; @interface MyAppDelegate : NSObject <UIApplicationDelegate> { Reachability *hostReach; } @end // MyAppDelegate.m - (void)reachabilityChanged:(NSNotification *)note { Reachability* curReach = [note object]; NSParameterAssert([curReach isKindOfClass: [Reachability class]]); NetworkStatus status = [curReach currentReachabilityStatus]; if (status == NotReachable) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName"" message:@"NotReachable" delegate:nil cancelButtonTitle:@"YES" otherButtonTitles:nil]; [alert show]; [alert release]; } } - (void)applicationDidFinishLaunching:(UIApplication *)application { // ... // 監測網路情況 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil]; hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain]; hostReach startNotifer]; // ... }