如何在Swift中将WiFi路由器的颜色从绿色变为红色时收到通知?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (50)

当我的WiFi路由器颜色从绿色变为红色时,我想收到通知

我正在制作一个应用程序,它会告诉你是在线还是离线,从Swift的菜单栏开源

我想知道当Swift中WiFi颜色发生变化时是否可以获得通知。

我不能经常ping我的服务器去查看颜色是否已经改变,因为这将浪费互联网资源。

那么有可能在Swift中知道这一点吗?

提问于
用户回答回答于

我查看了代码,当你的互联网连接中断时,你所做的工作没有通知你,它只是在运行时检查是否有连接。要实现您想要的功能,我们需要添加通知

首先,声明可达性var

 private var reachability:Reachability!;

然后在您的didFinishLaunchingWithOptions方法中添加以下代码appdelegate

 self.reachability = Reachability.init()
         NotificationCenter.default.addObserver(self, selector: #selector(checkForReachability(notification:)), name: .reachabilityChanged, object: reachability)
        do{
            try reachability.startNotifier()
        }catch{
            print("could not start reachability notifier")
        }

我们所做的是初始化可达性变量并创建一个通知观察器,以便在通知程序的帮助下检测连接状态何时发生变化。

最后选择器方法是

@objc func checkForReachability(notification:NSNotification)
    {
        let reachability = notification.object as! Reachability
        switch reachability.connection {
        case .wifi:
            print("Reachable via WiFi")
        case .cellular:
            print("Reachable via Cellular")
        case .none:
            print("Network not reachable")
        }
    }

就是这样,从现在开始互联网连接中断时我们会得到通知,在上面的方法中你可以改变菜单栏图标的颜色。

用户回答回答于

首先,我将从iOS角度回答这个问题。但是您的GitHub演示适用于macOS。我认为基础是一样的。

我将在面向协议的方法中解决这个问题。

经过大量的搜索,我发现了Connectivity包装器可以实现。

是我将简要介绍的工作版本。导航栏将以绿色红色反映不同的连接状态。

定义协议:

当协议发生任何变化时,此协议将帮助任何感兴趣的对象得到通知。

protocol ConnectivityNotifiable {
    var connectivity: Connectivity { get }
    func startNotifyingConnectivityChangeStatus()
    func stopNotifyingConnectivityChangeStatus()
    func connectivityChanged(toStatus: ConnectivityStatus)
}

// Provide some default implementation through protocol extension
extension ConnectivityNotifiable {
    func startNotifyingConnectivityChangeStatus() {
        connectivity.isPollingEnabled = true
        connectivity.startNotifier()
        connectivity.whenConnected = { connectivity in
            self.connectivityChanged(toStatus: connectivity.status)
        }
        connectivity.whenDisconnected = { connectivity in
            self.connectivityChanged(toStatus: connectivity.status)
        }
    }
    func stopNotifyingConnectivityChangeStatus() {
        connectivity.stopNotifier()
    }
}

符合协议:

符合ConnectivityNotifiable协议将为连接状态更改时要通知的任何感兴趣对象添加功能。像监控这样的东西。

class ViewController: UIViewController, ConnectivityNotifiable {

    // ConnectivityNotifiable protocol requirement
    let connectivity = Connectivity()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Invoke the default implementation of the ConnectivityNotifiable protocol
        // requirement to be able to be notified
        startNotifyingConnectivityChangeStatus()

        // Reminder:
        // Don't forget to invoke stopNotifyingConnectivityChangeStatus() when
        // you are done or when the lifecycle of your controller ends
    }

    // ConnectivityNotifiable protocol requirement
    func connectivityChanged(toStatus: ConnectivityStatus) {
        // Everytime any change happens in the network connectivity 
        // this method will be invoked with appropriate connection status
        switch toStatus {

        case .connected, 
             .connectedViaWiFi, 
             .connectedViaCellular:
            // Connected/Internet available. Update any UI component

        case .notConnected, 
             .connectedViaWiFiWithoutInternet, 
             .connectedViaCellularWithoutInternet:
            // Disconnected/Internet not available. Update any UI component
        }
    }
}

老答案

如果您使用的是可更新的最新版本,则无需基于解决方案即可获得可访问性更改通知。它基于闭包的方法完全正常。NotificationCenter

不喜欢知道怎么做到这一点?是一个针对iOS平台的工作版本。克隆回购并检查自己。导航栏将以绿色橙色红色反映不同的连接状态。

定义协议:

当可达性发生任何变化时,该协议将帮助任何感兴趣的对象得到通知。

protocol Reachable {
    var reachability: Reachability { get }
    func startMonitoringReachabilityChangeStatus()
    func reachabilityChanged(to: Reachability.Connection)
}

extension Reachable {
    func startMonitoringReachabilityChangeStatus() {
        do {
            try reachability.startNotifier()
        } catch {
            print(error.localizedDescription)
        }
        reachability.whenReachable = { reachability in
            self.reachabilityChanged(to: reachability.connection)
        }
        reachability.whenUnreachable = { reachability in
            self.reachabilityChanged(to: reachability.connection)
        }
    }
}

符合协议:

符合Reachable协议会将功能添加到任何感兴趣的对象,以便在可达性状态发生变化时得到通知。像监控这样的东西。

class ViewController: UIViewController, Reachable {

    // Reachable protocol requirement
    let reachability: Reachability = Reachability()!

    override func viewDidLoad() {
        super.viewDidLoad()

        // initial reachability checkup
        reachabilityChanged(to: reachability.connection)

        // Invoke the default implementation of the Reachable protocol requirement 
        // to be able to be notified
        startMonitoringReachabilityChangeStatus()
    }

    // Reachable protocol requirement
    func reachabilityChanged(to: Reachability.Connection) {
        // Everytime any change happens in the network connectivity 
        // this method will be invoked with appropriate connection status
        switch to {
        case .wifi:
            DispatchQueue.main.async {
                // Update any UI component
            }
        case .cellular:
            DispatchQueue.main.async {
                // Update any UI component
            }
        case .none:
            DispatchQueue.main.async {
                // Update any UI component
            }
        }
    }
}

扫码关注云+社区

领取腾讯云代金券