判断当前网络状况 Reachability使用

    xiaoxiao2022-06-30  44

    一:确认网络环境3G/WIFI

        一. 添加源文件和framework     开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审(我们的)查的。     Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部:          1.1. 添加源文件:     在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图:     1.2.添加framework:     将SystemConfiguration.framework 添加进工程。如下图:               二. 网络状态     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;     }          三.检查当前网络环境     程序启动时,如果想检测可用的网络环境,可以像这样     // 是否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];         }     }     四. 链接状态的实时通知     网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户:          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];         // ...     }

    附:

    什么是UDP和TCP的区别是什么? TCP的全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信。 UDP全称为用户数据报协议,它可以提供非连接的不可靠的点到多点的通信。 用TCP还是UDP,那要看你的程序注重哪一个方面?可靠还是快速?

    TCP/IP 建立连接的过程  在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。  第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认;  第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态;  第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手。  (所谓的三次握手就是要有三次连接信息的发送/接收过程。TCP连接的建立需要进行三次连接信息的发送/接收。)

     

    转载请注明原文地址: https://ju.6miu.com/read-1125690.html

    最新回复(0)