在Swift中,WiFi路由器颜色从绿色变为红色时,如何获得通知?

时间:2018-09-28 07:38:02

标签: ios swift notifications reachability

我想在我的WiFi路由器颜色从绿色变为红色

时得到通知

我正在制作一个应用程序,它将通过开源的Swift菜单栏告诉您是在线还是离线,可以在https://github.com/deadcoder0904/net-alert处找到

我想知道在Swift中WiFi颜色更改时是否有可能得到通知。

我无法经常对服务器进行ping操作,以了解颜色已更改,因为这会浪费Internet资源。

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

2 个答案:

答案 0 :(得分:4)

首先,我将从iOS角度回答这个问题。但是您的GitHub演示适用于macOS。我认为基本知识是相同的。

我将以面向协议的方式解决这个问题。


更新:

经过大量搜索,我发现了Connectivity包装器的出色实现。如果您想进一步了解它,甚至还有一个描述性的博客文章Solving the Captive Portal Problem on iOS 此实现能够处理实际的Internet可用/不可用状态。

注意:不想进一步阅读? Here是我将简要说明的工作版本。导航栏将以绿色红色颜色反映不同的连接状态。

定义协议:

此协议将帮助在连接发生任何变化时通知任何感兴趣的对象。

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
        }
    }
}


旧答案

注意:如果您使用的是release中最新的Reachability,则不需要基于NotificationCenter的解决方案来获取可达性更改通知。与基于闭包的方法完全兼容。


不知道如何实现这一目标? Here是适用于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
            }
        }
    }
}

答案 1 :(得分:0)

我检查了代码,当互联网连接中断时,您的操作方式不会通知您,它只是在运行时检查是否存在连接。 为了实现您想要的功能,我们需要添加通知

首先,声明可达性变量

 private var reachability:Reachability!;

然后在didFinishLaunchingWithOptions的{​​{1}}方法中添加以下代码

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")
        }

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