当前位置: 首页 > 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()}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)//let usesWiFi = flags.contains(.isWWAN)return isReachable && (!needsConnection || canConnectAutomatically)}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)}}func notifyReachabilityChanged(_ flags: SCNetworkReachabilityFlags) {let isReachable = flags.contains(.reachable)let needsConnection = flags.contains(.connectionRequired)let canConnectAutomatically = flags.contains(.connectionOnDemand) || flags.contains(.connectionOnTraffic)let reachable = isReachable && (!needsConnection || canConnectAutomatically)NotificationCenter.default.post(name: .reachabilityChanged, object: nil, userInfo: ["reachable": reachable])}}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)
}@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}}}

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

http://www.lryc.cn/news/428839.html

相关文章:

  • (三)Flink Source 数据源
  • 第四届机电一体化、自动化与智能控制国际学术会议(MAIC 2024)
  • leetcode 089 打家劫舍
  • 等保测评基础知识(六)
  • 作业帮 TiDB 7.5.x 使用经验
  • c语言练习题1
  • 嵌入式开发就业方向有哪些?前景未来可期!
  • 系列:水果甜度个人手持设备检测-github等开源库和方案
  • Visual Studio中 生成版本号
  • AI入门指南(四):分类问题、回归问题、监督、半监督、无监督学习是什么?
  • Linux下本地端口转发
  • RPC 和 HTTP 理解
  • Visual Studio 2022 v17.11 发布
  • 通讯专题-RS232
  • 桥接模式详解
  • 使用一致性哈希解决哈希分片负载均衡的扩展性问题
  • 探索 Resolume Arena 7 - 引领 VJ 音视频创作的卓越软件
  • 三勾点餐系统|支持多端发布,方便二次开发
  • 深入理解AES加密算法:原理与Python实现
  • Redis中List数据类型常用命令
  • 借助Aapose.Cells 使用 C# 在 Excel 中读取、添加和编辑线程注释
  • 关于c++ grpc 和 c# grpc 通信的问题 以及 grpc 认证问题
  • C++进阶(14)类型转换、IO流
  • 配置oss cdn加速静态资源访问 阿里云
  • 实现 前端框架 SPA 路由功能:Hash 模式与 History 模式的手动实现
  • 去中心化的新时代:Web3技术的全球影响
  • 初始redis:List
  • Java | Leetcode Java题解之第355题设计推特
  • MVC与三层架构分层
  • Go语言基础--switch