当前位置: 首页 > news >正文

Swift实时监听判断是否连接有网络WIFI和蜂窝数据

本章节讲解如何使用swift连接网络,实时的监听到网络的状态,在主界面中进行调用,网络包含Wi-Fi 和 蜂窝。

1.封装一个判断是否有网络的类
2.在封装类注册通知
3.主界面接收注册通知,并且调用封装的网络类
4.成功测试,有网络为true,否则false

一:AllExpanded类

import UIKit
import WHToast
import MBProgressHUD
import SystemConfigurationclass AllExpanded{private var hud:MBProgressHUD?init() {startNetworkReachabilityNotifier()checkInitialNetworkStatus()}private func checkInitialNetworkStatus() {let isReachable = isConnectedToNetwork()notifyReachabilityChanged(isReachable: isReachable)}func isConnectedToNetwork() -> Bool {var zeroAddress = sockaddr_storage()zeroAddress.ss_len = __uint8_t(MemoryLayout<sockaddr_storage>.size)zeroAddress.ss_family = sa_family_t(AF_INET)let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {$0.withMemoryRebound(to: sockaddr.self, capacity: 1) { zeroSockAddress inSCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)}}var flags: SCNetworkReachabilityFlags = []if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false {return false}let isReachable = flags.contains(.reachable)let needsConnection = flags.contains(.connectionRequired)let canConnectAutomatically = flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic)return isReachable && (!needsConnection || canConnectAutomatically)}private func startNetworkReachabilityNotifier() {var zeroAddress = sockaddr_storage()zeroAddress.ss_len = __uint8_t(MemoryLayout<sockaddr_storage>.size)zeroAddress.ss_family = sa_family_t(AF_INET)let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {$0.withMemoryRebound(to: sockaddr.self, capacity: 1) { zeroSockAddress inSCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)}}var context = SCNetworkReachabilityContext(version: 0,info: UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()),retain: nil,release: nil,copyDescription: nil)if SCNetworkReachabilitySetCallback(defaultRouteReachability!, { (_, flags, info) inlet reachability = Unmanaged<AllExpanded>.fromOpaque(info!).takeUnretainedValue()reachability.notifyReachabilityChanged(flags)}, &context) {SCNetworkReachabilityScheduleWithRunLoop(defaultRouteReachability!, CFRunLoopGetCurrent(), CFRunLoopMode.defaultMode.rawValue)}}private func notifyReachabilityChanged(isReachable: Bool) {NotificationCenter.default.post(name: .reachabilityChanged, object: nil, userInfo: ["reachable": isReachable])}private func notifyReachabilityChanged(_ flags: SCNetworkReachabilityFlags) {let isReachable = flags.contains(.reachable) && (!flags.contains(.connectionRequired) || (flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic)))notifyReachabilityChanged(isReachable: isReachable)}}
extension Notification.Name {static let reachabilityChanged = Notification.Name("reachabilityChanged")
}

二:LoginViewController类

 override func viewDidLoad() {super.viewDidLoad()//接收注册的通知NotificationCenter.default.addObserver(self, selector: #selector(handleReachabilityChange(_:)), name: .reachabilityChanged, object: nil)// Check initial network status// Check initial network statuslet isReachable = allExpanded.isConnectedToNetwork()handleReachabilityChange(Notification(name: .reachabilityChanged, object: nil, userInfo: ["reachable": isReachable]))
}deinit {// Remove observer when the view controller is deinitializedNotificationCenter.default.removeObserver(self, name: .reachabilityChanged, object: nil)}@objc private func handleReachabilityChange(_ notification: Notification) {if let userInfo = notification.userInfo, let isReachable = userInfo["reachable"] as? Bool {//显示与隐藏红色的提示框(没有网络)if isReachable {loginView.netWorkVm.isHidden = true} else {loginView.netWorkVm.isHidden = false}}}

至此就阐述完毕,功能测试成功,运行到手机上,切换网络可实时的监听打印到数据信息;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 小白零基础学数学建模系列-Day8-多目标规划问题与案例实践
  • 网络安全领域含金量最高的5大赛事,每个网安人的梦!
  • NSSCTF练习记录:[SWPUCTF 2021 新生赛]crypto6
  • 《计算机操作系统》(第4版)第4章 存储器管理 复习笔记
  • 一些比较不错的资源网站
  • 制药 超纯水液体颗粒物检测:lighthouse液体粒子计数器选型 北京中邦兴业
  • 火爆国内外的《黑神话:悟空》,需要什么显卡才能玩?
  • vm 虚拟机无法调用摄像头(亲测有效)
  • 如何将TRIZ技术融入到智能家居的产品设计流程中?
  • 如何优化企业网站的索引情况?
  • [Spring] Spring原理(SpringBoot完结)
  • 普元EOS-数据实体、SDO接口和实现类、DataObject都是什么?
  • 迁移学习代码复现
  • 详讲C#中如何存储当前项目的设置-超级简单省事
  • CSS详知识点——CSS变形
  • ES6指北【2】—— 箭头函数
  • 【node学习】协程
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java基本数据类型之Number
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • ng6--错误信息小结(持续更新)
  • node入门
  • SpingCloudBus整合RabbitMQ
  • Travix是如何部署应用程序到Kubernetes上的
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 记录:CentOS7.2配置LNMP环境记录
  • 前嗅ForeSpider教程:创建模板
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​水经微图Web1.5.0版即将上线
  • ​油烟净化器电源安全,保障健康餐饮生活
  • # Apache SeaTunnel 究竟是什么?
  • #Z2294. 打印树的直径
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (02)vite环境变量配置
  • (2015)JS ES6 必知的十个 特性
  • (4) PIVOT 和 UPIVOT 的使用
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (定时器/计数器)中断系统(详解与使用)
  • (二十四)Flask之flask-session组件
  • (一)Docker基本介绍
  • (转) ns2/nam与nam实现相关的文件
  • (转)大型网站架构演变和知识体系
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .NET CF命令行调试器MDbg入门(一)
  • .Net FrameWork总结
  • .net流程开发平台的一些难点(1)
  • .pop ----remove 删除
  • :如何用SQL脚本保存存储过程返回的结果集
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @Documented注解的作用
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)