Как получить уведомление, когда цвет WiFi Router становится красным от зеленого в Swift? - PullRequest
0 голосов
/ 28 сентября 2018

Я хочу получать уведомления, когда цвет моего WiFi-роутера меняется с Зеленый на Красный

Я создаю приложение, которое сообщит вам, находитесь ли вы в сети илив автономном режиме от строки меню в Swift с открытым исходным кодом, которую можно найти по адресу https://github.com/deadcoder0904/net-alert

Я хочу знать, возможно ли получать уведомления при изменении цвета WiFi в Swift.

Я не могу постоянно пинговать свой сервер, чтобы узнать, что цвет изменился, так как это приведет к потере интернет-ресурсов.

Так можно ли узнать это в Свифте?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Прежде всего, я собираюсь ответить на это с точки зрения iOS.Но ваша демонстрация GitHub предназначена для macOS.Я думаю, что основы одинаковы.

Я пойду, чтобы решить эту проблему в подходе, ориентированном на протокол.


Обновление:

После довольно большого поиска яВы столкнулись с великолепной реализацией оболочки Connectivity .Существует даже описательный пост в блоге Решение проблемы портала авторизации на iOS , если вы хотите узнать о нем больше. Эта реализация может работать с фактическими доступными / недоступными состояниями Интернета.

Примечание: Не любите читать дальше? Здесь - это рабочая версия, которую я кратко проиллюстрирую.Панель навигации будет отображаться с Зеленый & Красный цвет для различных состояний подключения.

Определите протокол:

Этот протокол поможет любому заинтересованному объектуполучать уведомления при любых изменениях в подключении.

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
            }
        }
    }
}
0 голосов
/ 03 октября 2018

Я просмотрел код, и способ, которым вы это сделали, не уведомляет вас, когда интернет-соединение прерывается, он просто проверяет во время выполнения, есть ли соединение или нет.Чтобы добиться того, что вы хотите, нам нужно добавить Уведомления .

Сначала объявите достижимость 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")
        }

Что мы делаем, это инициализируем переменную достижимости и создаем наблюдателя уведомлений, чтобы определить, когда состояние соединения изменяется с помощью 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")
        }
    }

Вот и все, с этого момента, когда интернет-соединение прерывается, мы получаем уведомление, и описанным выше способом вы можете изменить цвет значка строки меню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...