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