iOS开发之网络监听(二)SCNetworkReachability

2023-11-01

SCNetworkReachability是SystemConfiguration库下的类。

判断当前网络是否可达

完整代码如下:

struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;
SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault,(const struct sockaddr*) &zeroAddress);

SCNetworkReachabilityFlags flags;

//判断当前网络是否可达
SCNetworkReachabilityGetFlags(ref, &flags);
CFRelease(ref);//释放ref

BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable));
if (isReachable)
{
    NSLog(@"当前有网络");
    //判断是否是蜂窝网络
    BOOL isWifi = ((flags & kSCNetworkReachabilityFlagsIsWWAN));
    if (isWifi)
    {
        NSLog(@"蜂窝网络");
    }
    else
    {
        NSLog(@"Wifi网络");
    }
}
else
{
    NSLog(@"当前无网络");
}

我们要使用的是系统的SCNetworkReachability类,直接引用头问价会报file not found,引这个类所在的框架<SystemConfiguration/SystemConfiguration.h>。使用sockaddr_in结构体,需要引入头文件<netinet/in.h>

在SCNetworkReachability类中找到这个函数,可以返回网络是否可达的bool值。

Boolean
SCNetworkReachabilityGetFlags			(
						SCNetworkReachabilityRef	target,
						SCNetworkReachabilityFlags	*flags
						)				API_AVAILABLE(macos(10.3), ios(2.0));

这个方法需要传两个参数,SCNetworkReachabilityRef类型的target和SCNetworkReachabilityFlags类型的flags,注意这里的 * 和SCNetworkReachabilityFlags的类型,SCNetworkReachabilityFlags是个OPTION,加 * 是要取到falgs的地址。

第一个参数:SCNetworkReachabilityRef类型的target

再去SCNetworkReachability中找创建SCNetworkReachabilityRef的方法,找到这个函数可以返回一个SCNetworkReachabilityRef类型的变量。

SCNetworkReachabilityRef __nullable
SCNetworkReachabilityCreateWithName		(
						CFAllocatorRef			__nullable	allocator,
						const char					*nodename
						)				API_AVAILABLE(macos(10.3), ios(2.0));

这个函数又需要传两个参数,一个CFAllocatorRef类型的allocator,可为空;另一个是const char类型的nodename。

看了下第一个参数的类型CFAllocatorRef,typedef const struct CF_BRIDGED_TYPE(id) __CFAllocator * CFAllocatorRef;

系统提供了一些供选择的参数:kCFAllocatorDefault、kCFAllocatorSystemDefault等,既然可为空,又提供了我们就先用默认的kCFAllocatorDefault试试。

第二个参数const char 类型的域名。传入域名,然后UTF8就可以了。

SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [@"" UTF8String]);

还找到两个个函数也可以返回SCNetworkReachabilityRef,我们用这个:

SCNetworkReachabilityRef __nullable
SCNetworkReachabilityCreateWithAddress		(
						CFAllocatorRef			__nullable	allocator,
						const struct sockaddr				*address
						)				API_AVAILABLE(macos(10.3), ios(2.0));

因为我们是判断互联网连接,并未传入域名,用这个函数即可。在Reachability里,判断一般互联网连接也是用的这个函数。

直接copy过来了,创建了一个struct sockaddr_in类型的zeroAddress

struct sockaddr_in zeroAddress;
bzero(&zeroAddress, sizeof(zeroAddress));
zeroAddress.sin_len = sizeof(zeroAddress);
zeroAddress.sin_family = AF_INET;

使用sockaddr_in,会报错,需要引入头文件#import <netinet/in.h>

    SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithAddress(kCFAllocatorDefault,(const struct sockaddr*) &zeroAddress);

第二个参数:SCNetworkReachabilityFlags类型的flags

看了下这个好弄,这个是个OPTION类型的,而且获取当前网络是否可达的函数SCNetworkReachabilityGetFlags里需要传入一个SCNetworkReachabilityFlags的地址,这个就好弄了,直接申明一个falgs,falgs取地址:

SCNetworkReachabilityFlags flags;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS开发之网络监听(二)SCNetworkReachability 的相关文章

随机推荐

  • 一文讲透产品经理如何用好ChatGPT

    作者 京东零售 何雨航 4 0版本的ChatGPT可以有效提升产品经理工作效率 但并无法替代产品经理的角色 一 引言 3月15日 OpenAI发布了最新的基于GPT 4的ChatGPT 关于其智能性的讨论热度在互联网上空前高涨 我之前体验过
  • 试用虚拟服务器,免费试用的虚拟服务器

    免费试用的虚拟服务器 内容精选 换一换 弹性公网IP是可以直接访问Internet的IP地址 一个弹性公网IP只能给一个裸金属服务器使用 私有IP是公有云内网所使用的IP地址 用于内网通信 私有IP不能访问Internet 虚拟IP也称为
  • 类名称:CPicture

    新建一个基于对话框的工程 给你的对话框中加入一个静态文本控件 Static Text 或者图片控件 Picture Control 利用ClassWizard给控件关联一个变量 类型是 CPictureEx的 如 CPictureEx m
  • 借助国内ChatGPT平替+markmap/Xmind飞速生成思维导图

    系列文章目录 借助国内ChatGPT平替 MindShow 飞速制作PPT 借助国内ChatGPT平替 剪映 百度AIGC平台快速制作短视频 利用ChatGPT编写Excel公式 对比讯飞星火与ChatGPT对Excel公式的回答 文章目录
  • Application.OpenURL不同平台的使用

    using UnityEngine using System Collections public class testjar MonoBehaviour private static readonly int LocalVersion 1
  • 系统设计和机器学习算法

    LAMDA 机器学习书与数据挖掘研究所 算法训练网站 提供了大量可以练习的网站 1 Leetcode 2 Geeksforgeeks 3 Hackerrank 4 Lintcode paddlepaddle 系统设计 关注 系统设计 面向对
  • 测绘专业计算机编程要求,关于一些测绘圈子的信息,你需要了解!

    原标题 关于一些测绘圈子的信息 你需要了解 测绘学发展到今天 已经不再仅仅是简单的测量和制图了 如果你想往上发展 没有这些技能可能会很困难 这个时候 没有两把刷子 你好意思说你在测绘圈混 一 必要的数据基础和测绘学专业基础理论 这是进入测绘
  • 方舟服务器id哪里显示,明日方舟问卷id在哪查看?问卷id查看方法介绍

    明日方舟问卷id怎样填 找到自己的信息 完成奖励兑换 游戏爱好者小编带来方法详情 成功完成庆典活动 感谢庆典问卷数字id查看攻略 首先这个数字ID就在游戏主界面的个人昵称下方 具体位置如下图所示 注意这一串数字都属于数字ID 需要全部填写在
  • JavaScript洗牌函数

    喜欢做笔记 洗牌函数的封装 function getRandom min max return Math floor Math random max min 1 min function shuffle arr 不修改原数组 let arr
  • 公积金提取 -- 小黑日常超详细教程

    公积金说明 是入职以后五险一金中的一金 它的产生是国家给予的福利 国家规定它的缴纳数组成是 工资的6 12 然后按照公司给予福利的6 12 区间值计算 公积金存款 公司缴纳的百分比 x 你的工资 x 2 注 正经公司会根据实际发给你的工资计
  • 背完这444句,你的口语绝对不成问题了

    1 I see 我明白了 2 I quit 我不干了 3 Let go 放手 4 Me too 我也是 5 My god 天哪 6 No way 不行 7 Come on 来吧 赶快 8 Hold on 等一等 9 I agree 我同意
  • 公共数据运营模式研究报告 附下载

    本报告以公共数据运营模式为核心 以释放公共数据价值为目标 深入分析公共数据概念及特征 厘清公共数据运营的内涵及本质 提出纵深分域数据要素市场运营体系的总体思路 构建了一座 一个数据底座 两场 两级市场 三域 三个区域 四链 四个链条 的运营
  • Vue(踩坑)Error in render “TypeError Cannot read properties of undefined (reading ‘length‘)“

    我在网上搜了好久 说是我层级太深了 taskfillist我在vuex中的state中定义的是一个空数组 div 解决办法 在组件mounted过程中 taskfillist声明的空数组 在taskfillist length前面增加tas
  • MERN堆栈

    转自GeeksforGeeks的 Jasraj MERN Stack 翻译 MERN堆栈 MERN堆栈 是一个 Javascript 堆栈 用于更轻松 更快速地部署全栈Web应用程序 MERN堆栈包含 4 项技术 即 MongoDB Exp
  • 基于LIRI数据集的R语言探索:优化分析和可视化技巧

    基于LIRI数据集的R语言探索 优化分析和可视化技巧 引言 在数据科学和数据分析领域 R语言一直以来都是最受欢迎的工具之一 本文将使用LIRI数据集作为案例 介绍如何使用R语言进行数据分析和可视化 我们将涵盖数据清洗 特征提取 探索性数据分
  • 【matlab】中取矩阵的某一行某一列

    1 操作指令 取某一行 Ki K i 取某一列 Kj K j 取某几行 Kij K i j 取某几列 Kij K i j i和j表示行数和列数 2 举例分析 例如矩阵K 1 2 3 4 5 6 7 8 9 三行三列 K 1 2 3 4 5
  • 【C语言】指针题及解析

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 例一 需要考虑大小端问题 该例仅限32位平台 小端存储模式 in
  • requests.post()提取返回数据中的具体某个数值

    返回json数据是这样的 提取返回code rsp requests post url data jsonData headers headers timeout 3 json code rsp code if code 1000 prin
  • VRF配置

    SW 2既作为集团核心交换机 同时又使用相关技术将SW 2模拟为Internet交换机 实现集团内部业务路由表与Internet路由表隔离 那位大神能教教我这道题目要怎么做啊 转载于 https blog 51cto com 1432192
  • iOS开发之网络监听(二)SCNetworkReachability

    文章目录 判断当前网络是否可达 第一个参数 SCNetworkReachabilityRef类型的target 第二个参数 SCNetworkReachabilityFlags类型的flags SCNetworkReachability是S