当前位置: 首页 > 工具软件 > Reachability > 使用案例 >

常用API:1.Reachability.h (用于判定iPhone是否连接网络)

松霖
2023-12-01

常用API:1.Reachability.h (用于判定iPhone是否连接网络)



1.头文件:


typedef enum {

    NotReachable = 0,

    ReachableViaWiFi,

    ReachableViaWWAN

} NetworkStatus;

#define kReachabilityChangedNotification @"kNetworkReachabilityChangedNotification"


@interface Reachability: NSObject

{

    BOOL localWiFiRef;

    SCNetworkReachabilityRef reachabilityRef;

}


//reachabilityWithHostName- Use to check the reachability of a particular host name.

+ (Reachability*) reachabilityWithHostName: (NSString*) hostName;


//reachabilityWithAddress- Use to check the reachability of a particular IP address.

+ (Reachability*) reachabilityWithAddress: (const struct sockaddr_in*) hostAddress;


//reachabilityForInternetConnection- checks whether the default route is available.  

//  Should be used by applications that do not connect to a particular host

+ (Reachability*) reachabilityForInternetConnection;


//reachabilityForLocalWiFi- checks whether a local wifi connection is available.

+ (Reachability*) reachabilityForLocalWiFi;


//Start listening for reachability notifications on the current run loop

- (BOOL) startNotifier;

- (void) stopNotifier;


- (NetworkStatus) currentReachabilityStatus;

//WWAN may be available, but not active until a connection has been established.

//WiFi may require a connection for VPN on Demand.

- (BOOL) connectionRequired;

@end


2.相关知识和使用说明


什么是UDP和TCP的区别是什么?

TCP的全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信。

UDP全称为用户数据报协议,它可以提供非连接的不可靠的点到多点的通信。

用TCP还是UDP,那要看你的程序注重哪一个方面?可靠还是快速?

 

 

 

TCP/IP 建立连接的过程 

在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 
第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认; 

第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态; 

第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手。 
(所谓的三次握手就是要有三次连接信息的发送/接收过程TCP连接的建立需要进行三次连接信息的发送/接收

 


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


    1. 添加源文件和framework

    

    开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审(我们的)查的。

    Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部:

    

    1.1. 添加源文件:

    在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图:


    

    

    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];

        // ...

    }

 类似资料: