SwiftyReachability 是一个用 Swift 编写的简单且轻量级的网络接口管理器。
它自由地借鉴了 https://github.com/tonymillion/Reachability,旨在提供一个更新的接口,其中包括自其最新更新以来 iOS 世界引入的所有创新,并添加了新功能。
您可以使用 Swift Package Manager 将 SwiftyReachability 添加到您的项目。
在 Xcode 中,选择 File > Add Packages...
复制以下内容并粘贴到搜索/输入框中。
https://github.com/antonio-war/SwiftyReachability
使用 Up to Next Major Version 作为依赖规则,并输入当前的 SwiftyReachability 版本。 然后单击 Add Package。
SwiftyReachability 的主要目的是跟踪设备连接。 通过 SwiftyConnectionStatus 可以了解设备是否在线或离线。
enum SwiftyConnectionStatus {
case online
case offline
}
当设备在线时,了解有关连接类型的信息可能很有用。 您可以通过 SwiftyConnectionType 来做到这一点。
enum SwiftyConnectionType {
case cellular(radioType: SwiftyRadioType)
case wifi
case ethernet
}
与原始 Reachability 框架不同,我们引入了其他信息,当设备连接到蜂窝网络时,您可以通过 SwiftyRadioType 知道它是否正在使用 3G、LT 或其他某种无线电类型。
enum SwiftyRadioType {
case undefined
case _2G
case _3G
case _4G
case _5G
}
但是,在某些设备上,此功能目前还不可用。
如果您需要访问当前信息,而无需被告知未来的更改,则可以通过直接访问 SwiftyReachability 的共享实例来做到这一点。
let connectionManager = SwiftyReachability.shared
let status = connectionManager.connectionStatus
let type = connectionManager.connectionType
当您的应用程序的状态需要根据连接状态进行更新时,您可能需要一个观察者。 显然,SwiftyReachability 为这种类型的实现提供了所有元素。
对于使用 UIKit 创建的简单对象或视图,我们提供了一个面向协议的解决方案。 该对象必须符合 SwiftyReachabilityObserver 协议并实现所需的方法。 他还必须决定何时开始和停止观察。
class UIKitViewController: UIViewController, SwiftyReachabilityObserver {
@IBOutlet weak var statusLabel: UILabel!
@IBOutlet weak var connectionTypeImage: UIImageView!
@IBOutlet weak var radioTypeLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
startObserving()
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
stopObserving()
}
func didChangeConnectionStatus(_ status: SwiftyConnectionStatus) {
DispatchQueue.main.async {
switch status {
case .online:
self.statusLabel.text = "Online"
self.statusLabel.backgroundColor = .systemGreen
case .offline:
self.statusLabel.text = "Offline"
self.statusLabel.backgroundColor = .systemRed
}
}
}
func didChangeConnectionType(_ type: SwiftyConnectionType?) {
DispatchQueue.main.async {
guard let connectionType = type else {
self.connectionTypeImage.isHidden = true
self.radioTypeLabel.isHidden = true
return
}
switch connectionType {
case .cellular(let radioType):
self.connectionTypeImage.image = UIImage(systemName: "antenna.radiowaves.left.and.right")
self.connectionTypeImage.isHidden = false
self.radioTypeLabel.text = radioType.description
self.radioTypeLabel.isHidden = false
case .wifi:
self.connectionTypeImage.image = UIImage(systemName: "wifi")
self.connectionTypeImage.isHidden = false
self.radioTypeLabel.isHidden = true
case .ethernet:
self.connectionTypeImage.image = UIImage(systemName: "cable.connector")
self.connectionTypeImage.isHidden = false
self.radioTypeLabel.isHidden = true
}
}
}
}
在这种情况下,我们创建了一个带有 ObservableObject 的特殊解决方案。 它非常容易使用 SwiftyReachabilityObserverUI。
struct SwiftUIView: View {
@ObservedObject
var connectionObserver : SwiftyReachabilityObserverUI = SwiftyReachabilityObserverUI()
var body: some View {
VStack {
if connectionObserver.connectionStatus == .online {
Text("Online")
} else {
Text("Offline")
}
if let connectionTypeDescription = connectionObserver.connectionType?.description {
Text(connectionTypeDescription)
}
}
}
}
与任何其他与 Reachability 相关的软件包一样,在模拟器执行的情况下,网络观察者的功能可能会出现延迟。 因此,我们建议在设备上测试您的代码,这些问题不会发生。
SwiftyCache 在 Apache 2.0 许可证下发布。