IOS 网络检测

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

}



                                                           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值