iOS 判断当前是否连接到网络和网络类型

之前有判断过是否连接到网络,没有使用apple的示例中的Reachability。

#import <sys/socket.h>

#import <netinet/in.h>

#import <arpa/inet.h>

#import <SystemConfiguration/SCNetworkReachability.h>

-(BOOL)isConnectToNewtwork

{

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;

BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);

CFRelease(defaultRouteReachability);

if (!didRetrieveFlags) {

printf("Error. Count not recover network reachability flags\n");

return NO;

}

BOOL isReachable = flags & kSCNetworkFlagsReachable;

BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;

return (isReachable && !needsConnection) ? YES : NO;

}

现在要判断网络的状态时,开始考虑用Reachability,http://www.cnblogs.com/mrhgw/archive/2012/08/01/2617760.html,这里有下载的连接,并且在http://bbs.9ria.com/thread-190107-1-1.html有提到重构,这样可以判断蜂窝数据使用的是3G还是2G。

//Reachability.m 中 networkStatusForFlags 方法重构
- (NetworkStatus) networkStatusForFlags: (SCNetworkReachabilityFlags) flags
{
        if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
        {
                return NotReachable;
        }

        BOOL retVal = NotReachable;

        if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
        {
                // if target host is reachable and no connection is required
                //  then we‘ll assume (for now) that your on Wi-Fi
                retVal = ReachableViaWiFi;
        }

        if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
         (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
        {
        // ... and the connection is on-demand (or on-traffic) if the
        //     calling application is using the CFSocketStream or higher APIs
        if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
        {
            // ... and no [user] intervention is needed
            retVal = ReachableViaWiFi;
        }
    }

    if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
        {
        if((flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable) {
            if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {
                retVal = ReachableVia3G;
                if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {
                    retVal = ReachableVia2G;
                }
            }
        }
        }
        return retVal;
}

//在需要用的地方实现以下2个方法
//检查当前网络连接是否正常
-(BOOL)connectedToNetWork
{
        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;

        BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
        CFRelease(defaultRouteReachability);

        if (!didRetrieveFlags) {
                printf("Error. Count not recover network reachability flags\n");
                return NO;
        }

        BOOL isReachable = flags & kSCNetworkFlagsReachable;
        BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
        return (isReachable && !needsConnection) ? YES : NO;
}

//检查网络连接类型
-(void)checkNetworktype:(id)sender{
    NSString *connectionKind;
    if ([self connectedToNetWork]) {
       Reachability *hostReach = [Reachability reachabilityWithHostName:@"www.google.com"];
        switch ([hostReach currentReachabilityStatus]) {
            case NotReachable:
                connectionKind = @"没有网络链接";
                break;
            case ReachableViaWiFi:
                connectionKind = @"当前使用的网络类型是WIFI";
                break;
            case ReachableVia3G:
                connectionKind = @"当前使用的网络链接类型是WWAN(3G)";
                break;
            case ReachableVia2G:
                connectionKind = @"当前使用的网络链接类型是WWAN(2G)";
                break;
            default:
                break;
        }
        }else {
                connectionKind = @"没有网络链接";
        }
}

虽然这样的方法可以判断,但是结果并不准确。

找到另外一种简单又准确的方法:

typedef enum {
    NETWORK_TYPE_NONE = 0,
    NETWORK_TYPE_2G   = 1,
    NETWORK_TYPE_3G   = 2,
    NETWORK_TYPE_4G   = 3,
    NETWORK_TYPE_5G   = 4,//  5G目前为猜测结果
    NETWORK_TYPE_WIFI = 5
}NETWORK_TYPE;

-(NSString *)getNetworkType
{
    NSString *connectionKind;
    if ([self isConnectToNewtwork]) {
        UIApplication *app = [UIApplication sharedApplication];
        NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews];
        NSNumber *dataNetworkItemView = nil;
        for (id subview in subviews) {
            if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]])     {
                dataNetworkItemView = subview;
                break;
            }
        }
        NETWORK_TYPE nettype = NETWORK_TYPE_NONE;
        NSNumber * num = [dataNetworkItemView valueForKey:@"dataNetworkType"];
        nettype = [num intValue];

        switch ( nettype ) {
            case NETWORK_TYPE_NONE:
                connectionKind = @"没有网络链接";
                break;
            case NETWORK_TYPE_WIFI:
                connectionKind = @"当前使用的网络类型是WIFI";
                break;
            case NETWORK_TYPE_4G:
                connectionKind = @"当前使用的网络链接类型是WWAN(4G)";
                break;
            case NETWORK_TYPE_3G:
                connectionKind = @"当前使用的网络链接类型是WWAN(3G)";
                break;
            case NETWORK_TYPE_2G:
                connectionKind = @"当前使用的网络链接类型是WWAN(2G)";
                break;
            default:
                break;
        }

    }else {

       connectionKind = @"没有网络链接";

    }
    return connectionKind;
}
时间: 2024-08-24 17:31:50

iOS 判断当前是否连接到网络和网络类型的相关文章

iOS 判断网络连接状态的几种方法

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "PingFang SC"; color: #801b80 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px "Comic Sans MS"; color: #801b80 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Arial; col

判断网络是否连接 和 判断GPS是否连接

//判断网络是否连接 public static Boolean isNetworkEnabled(Context context){ int status=-1  //设置默认连接的状态为-1 ConnectivityManager connectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = connec

iOS 判断网络状态 简单示例

添加SystemConfiguration.framework 到工程中 对应的.h文件 #import <UIKit/UIKit.h> @interface ViewController : UIViewController //如果方法前面加+,就相当于类的静态方法,这里要注意一下 - (BOOL) connectedToNetwork; @end 对应的.m文件 #import "ViewController.h" #import <Foundation/Fou

iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断)

iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断) 2013-12-11 21:13 1416人阅读 评论(0) 收藏 举报  分类: cocoa SDK(139)  目录(?)[+] 在没有网络的情况下,音频的后台播放比较简单,google一下可以搜到很多资料,但是如果每次歌曲的请求都是通过网络,就不成了,有时可以也扛不了几首,这里总结下实现方法,可以实现像电台一样的功能,后台播放,网络请求歌曲,Remote控制,锁屏有封面,电话和听歌打断处理等.   初始化A

在与SQL Server建立连接时出现于网络相关的或特定于实例的错误

客户遇到一个问题,用“服务器名\实例名”远程连接另外一台命名实例的时候连接失败,报“在与SQL Server建立连接时出现于网络相关的或特定于实例的错误,未找到或无法访问服务器.请验证实例名称是否正确并且SQL Server已配置允许远程访问连接.(provider:SQL Network Interfaces,error:26-定位指定的服务器/实例时出错)”. 首先,尝试用ip和端口号进行连接,发现可以连接上,说明实例运行正常,并不是因为实例未开启导致无法连接,如果此连接失败,则需要检查实例

IOS网络——检测网络状态:Reachability

1.iOS平台是按照一直有网络连接的思路来设计的,开发者利用这一特点创造了很多优秀的第三方应用.大多数的iOS应用都需要联网,甚至有些应用严重依赖网络,没有网络就无法正常工作. 2.在你的应用尝试通过网络获取数据之前,你需要知道当前设备是否知道连接上了网络,甚至有时候你可能还需要知道当前网路是由wifi还是由移动蜂窝网络提供的. 3.“在网络访问失败的时候,应用没有做出适当的提示”是苹果的iOS审核团队拒绝一个应用的常见理由.苹果要求你必须先检测网络连接状态,当网络不可用的时候以某种方式告知用户

如何 判断 设备 是否 连接 上 了 wifi

这里,我给出一个函数 1 public boolean sale_connect_check(WifiConfiguration wcg,Context context) { 2 boolean judge_2 = false;//二重判断的布尔变量 3 int wcgID = wifiManager.addNetwork(wcg);//获取所曾网络id 4 boolean judge = wifiManager.enableNetwork(wcgID, true);//就行操作,注意,网上很多

iOS开发网络篇—网络编程基础

iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过网络跟外界进行数据交互.数据更新,应用才能保持新鲜.活力 (3)如果没有了网络,也就缺少了数据变化,无论外观多么华丽,终将变成一潭死水 移动网络应用 = 良好的UI + 良好的用户体验 + 实时更新的数据 新闻:网易新闻.新浪新闻.搜狐新闻.腾讯新闻 视频:优酷.百度视频.搜狐视频.爱奇艺视频 音乐

与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。

今天同学请教我数据库为什么打不开了,打开SQL Server 2008 的 SQL Server Management Studio,输入sa的密码发现,无法登陆数据库?提示以下错误: "在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误.未找到或无法访问服务器.请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接. (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接)": 他最近刚刚装过了