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

#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. bzoj 1823: [JSOI2010]满汉全席

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; ],next[ ...

  2. POJ 1573 Robot Motion 模拟 难度:0

    #define ONLINE_JUDGE #include<cstdio> #include <cstring> #include <algorithm> usin ...

  3. 5.2使用select,poll

    5.2 使用select,poll   // CPU占用率低,适用于很多简单场合 参考:UNIX环境高级编程 I/O多路转接 监测多个文件,只要有某一个文件可读/可写/异常或超时,即返回 int se ...

  4. php 获取当前url,可以规避框架url重写后还有index.php的情况

    function get_url(){ $pageURL = 'http'; if ($_SERVER["HTTPS"] == "on") { $pageURL ...

  5. mac下安装apache+php+mysql

    运行“sudo apachectl start”,再输入帐号密码,这样Apache就运行了. 运行“sudo apachectl -v”,你会看到Mac OS X 10.6.3中的Apache版本号: ...

  6. node开发 npm install -g express-generator@4

    Node forever : 1,forever start --uid test start app.js 2,forever start --uid test start -a app.js 3, ...

  7. Hibernate xml格式和anno格式 mappedby

    xml配置的时候多对一 一对多的外键可以配置一样,但是anno不太好弄,多这边配完了,一那边用个mappedby"“自己在对方的属性”就可以,不然要建一张中间表.xml的mappedby因为 ...

  8. jenkins持续集成工具

    jenkins是开源的 持续集成.持续构建的可视化web工具,持续构建说直白,就是各种项目的自动化编译.打包.分发部署. 好很多优点: 1.支持多语言 2.跟svn.git能无缝集成 3.直接与知名源 ...

  9. 2014年2月份第3周51Aspx源码发布详情

    NHibernateSample示例源码  2014-2-21 [VS2010]源码描述:NHibernateSample示例源码,利用NHibernate配置数据库相关映射,方便快捷,欢迎感兴趣用户 ...

  10. HYSBZ 1415 - 聪聪和可可(概率DP)

    http://vjudge.net/problem/viewProblem.action?id=20613 题意:不用说了,中文题. 这个题可以用概率DP来做. 题中要求猫抓到老鼠的时间期望.分析一下 ...