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 ...
随机推荐
- Android Webview 背景透明
两个关键点: 1 fBarParams.format = PixelFormat.RGBA_8888; 2 mWebView.setBackgroundColor(Color.TRAN ...
- 二模 (12) day1
第一题: 题目大意: 求由N个1,M个0组成的排列的个数,要求在排列的任意一个前缀中,1的个数不少于0的个数.N,M<=5000. 解题过程: 1.看到N,M的范围就明确肯定不会是dp,因为起码 ...
- TClientDataSet 设计期 多次New 字段问题
第一次New几个字段后,右键菜单CreateDataSet 后来需要再New几个字段. 右键菜单,先 ClearData(不这样,会报 打开的数据集不能执行 这个New字段的操作),然后在 字段编辑器 ...
- 关于oc运行时 isa指针详解
Cocoa框架是iOS应用程序的基础,了解Cocoa框架,对开发iOS应用有很大的帮助. 1.Cocoa是什么? Cocoa是OS X和 iOS操作系统的程序的运行环境. 是什么因素使一个程序成为Co ...
- primitive数据类型
/*primitive数据类型 *primitive主要是用来存储原始的数据 *boolean\byte\short\int\long\double **/public class Shujuleix ...
- [UIImage resizableImageWithCapInsets:]使用注意
转自:http://www.cnblogs.com/scorpiozj/p/3302270.html 最近在sae上搭建了个wp,因为深感自己前端的东西缺乏,所以想依次为契机,学习一下.本文是从个人的 ...
- sap 根据TOCE找 USER_EXIT
*&---------------------------------------------------------------------* *& Report ZUSER_EX ...
- numpy中的broadcast
关于broadcast,官方文档描述如下: Each universal function takes array inputs and produces array outputs by perfo ...
- 手机端APP原型相关
http://www.isux.us/demoo/index.php(很慢) https://www.mockplus.cn/
- PHP 防范CC攻击
CC攻击就是对方利用程序或一些代理对您的网站进行不间断的访问,造成您的网站处理不了而处于当机状态,下面是PHP方法:将以下代码另存为php文件,然后首行include入你的common.php文件中. ...