老大新增个需求,连接服务器时要区分内外网,需求理解了,现实很骨感啊,没办法,干.

#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平台网络类型检测的更多相关文章

  1. iOS获取网络类型的四种方法

    Reachability类只能区分WIFI和WWAN类型,却无法区分2G网和3G网. 网上也有些方法,却都存在Bug. 经过网上查找资料和测试,基本上总结了以下几种方法: 1.使用导航栏的方式:(私有 ...

  2. iOS开发 - Swift实现检测网络连接状态及网络类型

    一.前言 在移动开发中,检测网络的连接状态尤其检测网络的类型尤为重要.本文将介绍在iOS开发中,如何使用Swift检测网络连接状态及网络类型(移动网络.Wifi). 二.如何实现 Reachabili ...

  3. iOS中使用 Reachability 检测网络区分手机网络类型 WiFi 和2 3 4 G

    如果你想在iOS程序中提供一仅在wifi网络下使用(Reeder),或者在没有网络状态下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测. 写本文的目的 了解Re ...

  4. 检测 iOS 系统网络权限被关闭

    背景 一直都有用户反馈无法正常联网的问题,经过定位,发现很大一部分用户是因为网络权限被系统关闭,经过资料搜集和排除发现根本原因是: 第一次打开 app 不能访问网络,无任何提示 第一次打开 app 直 ...

  5. iOS中使用 Reachability 检测网络

    iOS中使用 Reachability 检测网络 内容提示:下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测.   写本文的目的 了解Reachability都 ...

  6. 【开发记录】iOS中使用 Reachability 检测网络

    如果你想在iOS程序中提供一仅在wifi网络下使用(Reeder),或者在没有网络状态下提供离线模式(Evernote).那么你会使用到Reachability来实现网络检测. 写本文的目的 了解Re ...

  7. iOS:关于获取网络类型和运营商信息

    目录 1. 获取运营商网络类型 2. 获取运营商信息 返回目录 1. 获取运营商网络类型 Apple的Reachability Sample看起来不错,但是只可以判断是否连接到互联网和是否连接Wifi ...

  8. iOS APP网络分析之rvictl(可以捕捉除了Wifi以外的网络类型)

    From: http://danqingdani.blog.163.com/blog/static/18609419520135204934551/ wireshark亲测可用. ********** ...

  9. Android检测网络是否可用并获取网络类型

    在类中使用getSystemService的时候需要这样进行使用:1. public class JajaMenu extends Activity { public static JajaMenu ...

随机推荐

  1. Spark运行环境的安装

    scala-2.9.3:一种编程语言,下载地址:http://www.scala-lang.org/download/    spark-1.4.0:必须是编译好的Spark,如果下载的是Source ...

  2. AFNetworking3.0概述

    最近一直在研究iOS网络开发,对NSURLSession套件进行了深入研究,作为iOS开发者,熟悉苹果的原生技术,可以在不需要第三方框架的情况下进行网络开发,也更有利于从底层了解iOS网络请求的原理, ...

  3. ButterKnife的配置

    1.打开settings选择Plugins 安装 安装完成后会提示重启AS. 2.在build.gradle文件中添加: compile 'com.jakewharton:butterknife:7. ...

  4. Python计算文件MD5值

    import hashlib def fileMD5(filename): m = hashlib.md5() #md5计算 #m = hashlib.sha1() #sha1计算 #m = hash ...

  5. matlab 解方程组

    1.解方程 最近有多人问如何用matlab解方程组的问题,其实在matlab中解方程组还是很方便的,例如,对于代数方程组Ax=b(A为系数矩阵,非奇异)的求解,MATLAB中有两种方法:(1)x=in ...

  6. Mousejack测试指南

    0x00 前言 近日,Bastille的研究团队发现了一种针对蓝牙键盘鼠标的攻击,攻击者可以利用漏洞控制电脑操作,他们将此攻击命名为MouseJack. 攻击者仅需要在亚马逊上以60美元购买设备,改造 ...

  7. 64位Ubuntu下的Eclipse、ADT终于可以生成R.java了,虚机也可以正常建立

    64位Ubuntu12下的Eclipse总也不能自动生成R.java,导致无法正常编译程序,建虚拟器的时候总是提示少文件....三天下班机器没关(无奈公司网络不给力)来安装lib包. 各种加载,总结一 ...

  8. HTML的表单

    HTML表单 <!-- <form></form>标签对用来创建一个表单,即定义表单的开始和结束位置,<form>表单具有下面等属性 1.action属性用来 ...

  9. Android白天/夜间模式Day/Night Mode标准原生SDK实现

     Android白天/夜间模式Day/Night Mode标准原生SDK实现 章节A:Android实现白天/夜间模式主要控制器在于UiModeManager,UiModeManager是Andr ...

  10. HDU 5784 (计算几何)

    Problem How Many Triangles (HDU 5784) 题目大意 给定平面上的n个点(n<2000),询问可以组成多少个锐角三角形. 解题分析 直接统计锐角三角形较困难,考虑 ...