【发布时间】:2015-10-05 11:34:54
【问题描述】:
在我的应用程序中,每当网络发生变化时,例如当应用程序连接、断开或更改(wifi 到数据)网络时,我都必须发出警报。
但是通过到达一个 url 来找到它似乎很昂贵。
iOS 中是否有可用的公共 api 来执行此操作。
【问题讨论】:
标签: ios objective-c networking
在我的应用程序中,每当网络发生变化时,例如当应用程序连接、断开或更改(wifi 到数据)网络时,我都必须发出警报。
但是通过到达一个 url 来找到它似乎很昂贵。
iOS 中是否有可用的公共 api 来执行此操作。
【问题讨论】:
标签: ios objective-c networking
我遵循了这个教程
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
}
}
}
}
【讨论】:
【讨论】:
【讨论】:
如果您在应用程序中使用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 类。
【讨论】: