如何获取网络变化(连接、断开、更改)的通知

7

我的应用程序需要在网络更改时发出警报,例如当应用程序连接或断开连接或更改(从wifi到数据网络)。

但是通过访问URL查找它似乎很耗费资源。

iOS中是否有公共API可用于执行此操作。

4个回答

5

我按照这个教程进行操作:

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

感谢--> Vasil Nunev

下载这个类并导入到我的项目中 --> 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
        }
    }
}
}

在你的实现中,每当状态改变时,你会收到两个通知。一个在可达性回调中,另一个在internetChanged()中。 - Nativ

3

请查看这份官方的苹果文档

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

还有一个完整的示例,介绍如何检测更改,并且该文档现在已经更新为ARC。

希望这能对您有所帮助。


1
可达性能否检测连接类型,例如wifi、vpn或数据卡等,就像元数据那样。 - sathishkumar_kingmaker
只有当您连接到Wi-Fi、蜂窝网络并且连接到互联网时,才能使用。我不记得您是否也了解VPN的信息,但我认为您可以检查一下。 - Lorenzo
下载这个例子,非常容易理解...你可以直接在模拟器或手机上运行。代码很小。 - Lorenzo

0

1
有没有办法我可以了解更多关于我的现有连接,比如它是在WiFi还是数据上,或者网络连接是常规的还是VPN之类的? - sathishkumar_kingmaker

0
如果您在应用程序中使用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
    }
}

你也可以使用苹果的SCNetworkReachbility类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接