【问题标题】:How to get notifications for Network change(Connect,Disconnect,Change)如何获取网络更改通知(连接、断开、更改)
【发布时间】:2015-10-05 11:34:54
【问题描述】:

在我的应用程序中,每当网络发生变化时,例如当应用程序连接、断开或更改(wifi 到数据)网络时,我都必须发出警报。

但是通过到达一个 url 来找到它似乎很昂贵。

iOS 中是否有可用的公共 api 来执行此操作。

【问题讨论】:

    标签: ios objective-c networking


    【解决方案1】:

    我遵循了这个教程

    https://www.youtube.com/watch?v=wDZmz9IsB-8

    学分 --> 瓦西尔·努涅夫

    下载这个类并导入我的项目 --> Reachability.swift

    https://github.com/ashleymills/Reachability.swift

    (Reachability.swift) --> 解压 -->Sources/Reachability.swift

    这是我的视图控制器

    import UIKit
    
    class ViewController: UIViewController {
    
    let reachability =  Reachability()!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        reachability.whenReachable = { _ in
            DispatchQueue.main.async {
                self.view.backgroundColor = UIColor.green
            }
        }
    
        reachability.whenUnreachable = { _ in
            DispatchQueue.main.async {
                self.view.backgroundColor = UIColor.red
            }
        }
    
        NotificationCenter.default.addObserver(self, selector: #selector(internetChanged), name: Notification.Name.reachabilityChanged , object: reachability)
        do{
            try reachability.startNotifier()
        } catch {
            print("Could not strat notifier")
        }
    }
    
    @objc  func internetChanged(note:Notification)  {
        let reachability  =  note.object as! Reachability
        if reachability.isReachable{
            if reachability.isReachableViaWiFi{
                self.view.backgroundColor = UIColor.green
            }
            else{
                DispatchQueue.main.async {
                    self.view.backgroundColor = UIColor.orange
                }
            }
        } else{
            DispatchQueue.main.async {
                self.view.backgroundColor = UIColor.red
            }
        }
    }
    }
    

    【讨论】:

    • 在您的实现中,每次状态更改时您都会收到 2 条通知。 1 在可达性回调和 1 在 internetChanged()
    【解决方案2】:

    看看这个苹果官方documentation

    使用可达性,您可以识别您的连接类型。

    还有一个完整的示例说明如何检测更改以及现在为 ARC 更新文档。

    希望对你有帮助

    【讨论】:

    • 可访问性检测连接类型,如 wifi 或 vpn 或数据卡等,如元数据..
    • 仅当您连接到 wi-fi、蜂窝网络以及连接到互联网时。我不记得你是否也有关于 vpn nut 的信息,我想你可以查一下。
    • 下载例子,很容易理解……可以直接在模拟器中运行,也可以在手机中运行。代码很小..
    【解决方案3】:

    【讨论】:

    • 无论如何我可以了解更多关于我现有连接的信息,例如它是否在 wifi 或数据或网络连接是常规的或类似的 VPN
    【解决方案4】:

    如果您在应用程序中使用Alamofire,则可以使用它的NetworkReachabilityManager.swift 类来监听网络连接。

    这是一段代码。

    @discardableResult
    open func startListening(onQueue queue: DispatchQueue = .main,
                                 onUpdatePerforming listener: @escaping Listener) -> Bool {
         stopListening()
         $mutableState.write { state in
             state.listenerQueue = queue
             state.listener = listener
         }
    
         var context = SCNetworkReachabilityContext(version: 0,
                                                       info: Unmanaged.passUnretained(self).toOpaque(),
                                                     retain: nil,
                                                    release: nil,
                                            copyDescription: nil)
         let callback: SCNetworkReachabilityCallBack = { _, flags, info in
             guard let info = info else { return }
             let instance = Unmanaged<NetworkReachabilityManager>.fromOpaque(info).takeUnretainedValue()
                instance.notifyListener(flags)
         }
    
         let queueAdded = SCNetworkReachabilitySetDispatchQueue(reachability, reachabilityQueue)
         let callbackAdded = SCNetworkReachabilitySetCallback(reachability, callback, &context)
    
         // Manually call listener to give initial state, since the framework may not.
         if let currentFlags = flags {
            reachabilityQueue.async {
                self.notifyListener(currentFlags)
            }
         }
    
         return callbackAdded && queueAdded
    }
    
    /// Stops listening for changes in network reachability status.
    open func stopListening() {
        SCNetworkReachabilitySetCallback(reachability, nil, nil)
        SCNetworkReachabilitySetDispatchQueue(reachability, nil)
        $mutableState.write { state in
            state.listener = nil
            state.listenerQueue = nil
            state.previousStatus = nil
        }
    }
    

    您也可以改用 Apple 的 SCNetworkReachbility 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      相关资源
      最近更新 更多