我想在我的WiFi路由器颜色从绿色变为红色
时得到通知我正在制作一个应用程序,它将通过开源的Swift菜单栏告诉您是在线还是离线,可以在https://github.com/deadcoder0904/net-alert处找到
我想知道在Swift中WiFi颜色更改时是否有可能得到通知。
我无法经常对服务器进行ping操作,以了解颜色已更改,因为这会浪费Internet资源。
那么有可能在Swift中知道这一点吗?
答案 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")
}
就是这样,从现在开始,当互联网连接中断时,我们会收到通知,在上述方法中,您可以更改菜单栏图标的颜色。