当前位置: 首页 > 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}}}

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


http://www.mrgr.cn/news/4520.html

相关文章:

  • 基于Sringboot+Vue个人驾校预约管理系统--论文pf
  • 两台电脑之间记事本内容如何转移?
  • Prometheus 1:安装(Centos7)
  • ant design pro v6 如何做好角色管理
  • WHAT - Lodash 的替代 es-toolkit
  • [第五空间 2021]EasyCleanup
  • Mysql高级 [Linux版] 性能优化 数据库系统配置优化 和 MySQL的执行顺序 以及 Mysql执行引擎介绍
  • datawind可视化查询-类型转换函数
  • MySQL 安装与配置指南
  • python爬虫入门
  • 面试题 08.06. 汉诺塔问题(整活版)(不讲武德)
  • p8 Run的流程和Docker原理
  • DOM型XSS
  • oracel数据库的增删改查示例
  • 勇闯计算机视觉(第一关--环境激活)
  • 端点安全新纪元:EDR与XDR技术的融合应用
  • c++ opencv开发环境搭建
  • 性能优化理论篇 | swap area是个什么东西
  • C#学习之路day2
  • mysql查询慢