iOS平台网络类型检测
老大新增个需求,连接服务器时要区分内外网,需求理解了,现实很骨感啊,没办法,干.
#import <Foundation/Foundation.h>
/*
依赖于以下Framework
SystemConfiguration
CoreTelephony
*/
typedef enum _NetWorkType
{
kNetworkOff = 0,
kNetworkWifi,
kNetworkWLan,//如果不能获取到更详细的,将统一返回该值(iOS7以上才能获取到)
kNetworkWLan2G,
kNetworkWLan3G,
kNetworkGPRS,
kNetworkEdge,
kNetworkWCDMA,
kNetworkHSDPA,
kNetworkHSUPA,
kNetworkCDMA1x,
kNetworkCDMAEVDORev0,
kNetworkCDMAEVDORevA,
kNetworkCDMAEVDORevB,
kNetworkHRPD,
kNetworkLTE,
}NetworkType;
@interface HSNetworkDetect : NSObject //通用接口
/*
返回0~2的网络类型枚举值NetworkType
*/
+(NetworkType)getNetworkType;
/*
iOS7及以上,确定是蜂窝网络的情况下,返回>2的网络类型枚举值;否则,仍返回2
*/
+(NetworkType)getCellularDataNetworkType;
/*
检测网络是否可达,使用Reachability
*/
+(BOOL)isReachable:(NSString*)address port:(NSInteger)port;
/*
获取当前连接的WIFI热点的SSID
*/
+(NSString*)getWifiSSID; @end
#import "HSNetworkDetect.h"
#import "Reachability.h"
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import <SystemConfiguration/CaptiveNetwork.h> #define ISIOS7 !([[[UIDevice currentDevice] systemVersion] floatValue] <=6.9f)
#define SENTENCED_EMPTY(string) (string = ((string == nil) ? @"":string)) @implementation HSNetworkDetect
#pragma mark 通用接口
+(NetworkType)getNetworkType
{
struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); //创建测试连接的引用:
SCNetworkReachabilityFlags flags;
SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
{
return kNetworkOff;
}
NetworkType retVal = kNetworkOff;
if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
{
retVal = kNetworkWifi;
}
if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
(flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
{
if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
{
retVal = kNetworkWifi;
}
} if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
{
if((flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable) {
if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection)
{
retVal = kNetworkWLan3G;
if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired)
{
retVal = kNetworkWLan2G;
}
}
}
}
return retVal;
}
+(NetworkType)getCellularDataNetworkType
{
if (ISIOS7)
{
CTTelephonyNetworkInfo *telephonyInfo = [CTTelephonyNetworkInfo new];
NSString* wlanNetwork = telephonyInfo.currentRadioAccessTechnology;
if (wlanNetwork == nil)
return kNetworkOff;
if([wlanNetwork isEqualToString:CTRadioAccessTechnologyGPRS ])
{
return kNetworkGPRS;
}
else if([wlanNetwork isEqualToString:CTRadioAccessTechnologyEdge ])
{
return kNetworkEdge;
}
else if([wlanNetwork isEqualToString:CTRadioAccessTechnologyWCDMA ])
{
return kNetworkWCDMA;
}
else if([wlanNetwork isEqualToString:CTRadioAccessTechnologyHSDPA ])
{
return kNetworkHSDPA;
}
else if([wlanNetwork isEqualToString:CTRadioAccessTechnologyHSUPA ])
{
return kNetworkHSUPA;
}
else if([wlanNetwork isEqualToString:CTRadioAccessTechnologyCDMA1x ])
{
return kNetworkCDMA1x;
}
else if([wlanNetwork isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0])
{
return kNetworkCDMAEVDORev0;
}
else if([wlanNetwork isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA])
{
return kNetworkCDMAEVDORevA;
}
else if([wlanNetwork isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB])
{
return kNetworkCDMAEVDORevB;
}
else if([wlanNetwork isEqualToString:CTRadioAccessTechnologyeHRPD ])
{
return kNetworkHRPD;
}
else if([wlanNetwork isEqualToString:CTRadioAccessTechnologyLTE ])
{
return kNetworkLTE;
}
}
return kNetworkWLan;
}
+(NSString*)getWifiSSID
{
NSArray *ifs = (__bridge id)CNCopySupportedInterfaces();
id info = nil;
for (NSString *ifnam in ifs)
{
info = (__bridge id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
if (info && [info count])
{
NSString *ssid=[info objectForKey:(__bridge NSString *)kCNNetworkInfoKeySSID];
//NSString *bssid=[info objectForKey:(__bridge NSString *)kCNNetworkInfoKeyBSSID];
//NSLog(@"interfaceName:%@ ssid:%@ bssid:%@",ifnam,ssid,bssid);
return ssid;
}
}
return nil;
}
+(BOOL)isReachable:(NSString*)address port:(NSInteger)port
{
Reachability* poReach = [Reachability reachabilityWithHostname:[NSString stringWithFormat:@"%@:%d",address,port]];
BOOL bRet = [poReach isReachable];
return bRet;
} @end PS--->老大的脾气你别猜,猜来猜去你也猜不明白.
iOS平台网络类型检测的更多相关文章
- iOS获取网络类型的四种方法
Reachability类只能区分WIFI和WWAN类型,却无法区分2G网和3G网. 网上也有些方法,却都存在Bug. 经过网上查找资料和测试,基本上总结了以下几种方法: 1.使用导航栏的方式:(私有 ...
- iOS开发 - Swift实现检测网络连接状态及网络类型
一.前言 在移动开发中,检测网络的连接状态尤其检测网络的类型尤为重要.本文将介绍在iOS开发中,如何使用Swift检测网络连接状态及网络类型(移动网络.Wifi). 二.如何实现 Reachabili ...
- iOS中使用 Reachability 检测网络区分手机网络类型 WiFi 和2 3 4 G
如果你想在iOS程序中提供一仅在wifi网络下使用(Reeder),或者在没有网络状态下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测. 写本文的目的 了解Re ...
- 检测 iOS 系统网络权限被关闭
背景 一直都有用户反馈无法正常联网的问题,经过定位,发现很大一部分用户是因为网络权限被系统关闭,经过资料搜集和排除发现根本原因是: 第一次打开 app 不能访问网络,无任何提示 第一次打开 app 直 ...
- iOS中使用 Reachability 检测网络
iOS中使用 Reachability 检测网络 内容提示:下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测. 写本文的目的 了解Reachability都 ...
- 【开发记录】iOS中使用 Reachability 检测网络
如果你想在iOS程序中提供一仅在wifi网络下使用(Reeder),或者在没有网络状态下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测. 写本文的目的 了解Re ...
- iOS:关于获取网络类型和运营商信息
目录 1. 获取运营商网络类型 2. 获取运营商信息 返回目录 1. 获取运营商网络类型 Apple的Reachability Sample看起来不错,但是只可以判断是否连接到互联网和是否连接Wifi ...
- iOS APP网络分析之rvictl(可以捕捉除了Wifi以外的网络类型)
From: http://danqingdani.blog.163.com/blog/static/18609419520135204934551/ wireshark亲测可用. ********** ...
- Android检测网络是否可用并获取网络类型
在类中使用getSystemService的时候需要这样进行使用:1. public class JajaMenu extends Activity { public static JajaMenu ...
随机推荐
- 浅析Oracle范式的概念(转载)
范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中 ...
- localStorage
length:唯一的属性,只读,用来获取storage内的键值对数量. key:根据index获取storage的键名 getItem:根据key获取storage内的对应value setItem: ...
- ECMAScript 6新特性(1)数组篇
数组现有的方法: .concat():连接两个或更多的数组,并返回结果. .join():把数组的所有元素放入一个字符串.元素通过指定的分隔符进行分隔. .pop():删除并返回数组的最后一个元素 . ...
- static关键字的理解
#include<stdio.h> int counter(int i){ static int count=0;//编译时只运行一次 count=count+i; return coun ...
- hdu 1031 (partial sort problem, nth_element, stable_partition, lambda expression) 分类: hdoj 2015-06-15 17:47 26人阅读 评论(0) 收藏
partial sort. first use std::nth_element to find pivot, then use std::stable_partition with the pivo ...
- ppurl
ppurl 就这么挂了?? 简直不敢相信 我才刚上不久,它竟然就这么挂啦??? 还是转到哪了? 有人知道吗? 表示我很愤怒,就好像当年新浪爱问共享就这么挂了一样 过了很久我才知道原来它转到新浪微盘了. ...
- linux命令每日一练习-pwd,cd
pwd显示当前路径. pwd -P没能明白什么意思, cd 进入目录 cd ..返回上级目录
- 2013年7月份第2周51Aspx源码发布详情
FineOffice自动化办公(OA)源码 2013-7-12 [ VS2010 ]源码描述:此源码使用fineui开发,作为村居使用的系统,所以命名为fineoffice,其实你在此基础上扩成CR ...
- 解决input之间的空隙
<!doctype html> <html> <head> <meta charset="UTF-8"> <meta name ...
- Google Polymer以及Web UI框架
时代在进步,原本前端只是用来简单的数据显示以及提交数据到后端处理逻辑的地方,而随着SPA的发展,前端的逻辑也越来越是庞大,恰巧,今天看微博的时候,发现一个概念讨论的比较多,就是 Web Compone ...