Schermata 2022-09-06 alle 10 04 08

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 为这种类型的实现提供了所有元素。

Swift / UIKit

对于使用 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
            }
        }
    }
}

SwiftUI

在这种情况下,我们创建了一个带有 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 许可证下发布。