iPhone开发技巧之网络篇(4)--- 确认网络环境
开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审查的。
Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图:
然后将 SystemConfiguration.framework 添加进工程:
Reachability 中定义了3种网络状态。
// the network state of the device for Reachability 1.5. typedef enum{ NotReachable= 0, ReachableViaCarrierDataNetwork, ReachableViaWiFiNetwork } NetworkStatus; // the network state of the device for Reachability 2.0. typedefenum{ NotReachable= 0, ReachableViaWiFi, ReachableViaWWAN } NetworkStatus; NotReachable //无连接 ReachableViaCarrierDataNetwork (ReachableViaWWAN) //使用3G/GPRS网络 ReachableViaWiFiNetwork (ReachableViaWiFi) //使用WiFi网络 //比如检测某一特定站点的接续状况,可以使用下面的代码: Reachability*r= [ReachabilityreachabilityWithHostName:@“www.apple.com”]; switch([r currentReachabilityStatus]) { caseNotReachable: // 没有网络连接 break; caseReachableViaWWAN: // 使用3G网络break; caseReachableViaWiFi: // 使用WiFi网络break;} //检测当前网络环境 //程序启动时,如果想检测可用的网络环境,可以像这样。 // 是否wifi + (BOOL) IsEnableWIFI{ return([[ReachabilityreachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable); } // 是否3G + (BOOL) IsEnable3G{ return([[ReachabilityreachabilityForInternetConnection] currentReachabilityStatus] != NotReachable); } //连接状态实时通知 //网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户//。由于Reachability1.5版与2.0版有一些变化,这里分开来说明使用方法。 Reachability 1.5 My.AppDelegate.h #import"Reachability.h" @interfaceMyAppDelegate: NSObject<UIApplicationDelegate> { NetworkStatusremoteHostStatus; } @property NetworkStatusremoteHostStatus; @end // My.AppDelegate.m #import"MyAppDelegate.h" @implementationMyAppDelegate @synthesizeremoteHostStatus; // 更新网络状态 - (void)updateStatus{ self.remoteHostStatus = [[ReachabilitysharedReachability] remoteHostStatus]; } // 通知网络状态 - (void)reachabilityChanged:(NSNotification*)note{ [selfupdateStatus]; if(self.remoteHostStatus == NotReachable) { UIAlertView*alert= [[UIAlertViewalloc] initWithTitle:NSLocalizedString(@"AppName", nil) message:NSLocalizedString(@"NotReachable", nil) delegate:nilcancelButtonTitle:@"OK"otherButtonTitles: nil]; [alert show]; [alert release]; } } // 程序启动器,启动网络监视 - (void)applicationDidFinishLaunching:(UIApplication*)application{ // 设置网络检测的站点 [[ReachabilitysharedReachability] setHostName:@"www.apple.com"]; [[ReachabilitysharedReachability] setNetworkStatusNotificationsEnabled:YES]; // 设置网络状态变化时的通知函数[[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(reachabilityChanged:) name:@"kNetworkReachabilityChangedNotification"object:nil]; [selfupdateStatus];} - (void)dealloc{ // 删除通知对象 [[NSNotificationCenterdefaultCenter] removeObserver:self]; [window release]; [superdealloc]; } Reachability 2.0 / MyAppDelegate.h @classReachability; @interfaceMyAppDelegate: NSObject<UIApplicationDelegate> { Reachability*hostReach;} @end // MyAppDelegate.m - (void)reachabilityChanged:(NSNotification*)note{ Reachability* curReach= [note object]; NSParameterAssert([curReach isKindOfClass: [Reachabilityclass]]); NetworkStatusstatus= [curReach currentReachabilityStatus]; if(status == NotReachable) { UIAlertView*alert= [[UIAlertViewalloc] 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]; // ...}