IOS 网络检测

来源:互联网 发布:传奇霸业轮回数据库 编辑:程序博客网 时间:2024/06/17 07:05

首先说明    苹果公司会拒绝没有检查网络状态就向用户提供下载选项的应用程序,并在网络出现错误时,确认网络连接并进行提醒。同样也拒绝使用过量数据的应用程序(如语音或数据资料),需进行当前连接测试,手机网络连接用户使用的是低质量的数据流,Wi-Fi连接用户的是高质量的数据流。

网络连接的测试的情况:

-(BOOL)checkWifiOK{    struct     sockaddr_in    localWifiAddress ;    bzero(  &localWifiAddress , sizeof(localWifiAddress ) );    localWifiAddress.sin_len  =  sizeof(localWifiAddress );    localWifiAddress.sin_family  = AF_INET ;        SCNetworkReachabilityRef  netReach = SCNetworkReachabilityCreateWithAddress( NULL ,  (struct   sockaddr *)&localWifiAddress );    SCNetworkConnectionFlags  flags ;    BOOL  didReciveFlags = SCNetworkReachabilityGetFlags( netReach , &flags  );    CFRelease(netReach) ;         if(  !didReciveFlags )     {         NSLog(@"获取信息失败 ");     }    else     {       BOOL  isReach  = flags & kSCNetworkFlagsReachable ;       BOOL  connect  = flags & kSCNetworkFlagsConnectionRequired ;                  if(  (isReach && !connect ) == YES )       {           if(  (flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN  )    //GPRS ,EDGE           {               NSLog(@"手机本地网络");           }           else            {               NSLog(@"wifi  网络");                return TRUE  ;           }       }                else        {           NSLog(@"不能连接网络");       }            }        return   FALSE ;}

注意:添加网络检时,在项目的Framework中添加: systemConfiguration.framework 框架库。


当然在应用程序运行时,网络连接的状态可能会发生改变,因此,对于整个应用生存周期内依赖数据连接的程序来说,应该随时对网络进行检测。

有几种方法进行实现:

(1)使用一个UIDevice类 监视网络可达性,设定定时或非定时的监视器 (watcher),当网络变化,观察者收到通知,它创建一个回调 来通知在当前run循环中异步的监视器对象,并触发回调。

  (2)重新获得IP和主机信息,在恢复站点IP地址后,使用

 SCNetworkReachabilityCreateWithAddress(<#CFAllocatorRef allocator#>, <#conststruct sockaddr *address#>);传递包含站点的sockaddr记录,最后检查 kSCNetworkFlagsReachable   标志进行判断。 

返回连接的IP地址:

hostname 返回当前设备的主机名称,gethostbyname()将主机名称转化为IP地址。

-(NSString *)hostname{    char baseName[255];    int  success = gethostname(baseName , 255 );    if(success != 0 )        return nil;    baseName[255]='\0';    //模拟器返回当前主机名称后加 .local域,iphone 不会    return  [NSString  stringWithFormat:@"%s.local",baseName ];    return  [NSString  stringWithFormat:@"%s",baseName ];    }

可直接在网站 whatismyip.com 中返回连接的IP地址。(同步操作,容易造成阻塞)

-(NSString *)whatismyipdotcom

{

   NSError  * error ;

    NSURL  * ipURL = [NSURL URLWithString:@"http://whatismyip.com/automation/n09230945.asp"];

    NSString  * ip = [NSString stringWithContentsOfURL: ipURL encoding:NSUTF8StringEncoding error: &error ];

   return  ip ? ip :[error localizedDescription ];    

}



                                                           

原创粉丝点击