移动应用程序通常需要有效的网络连接才能正常运行。但是,移动网络丢失是正常的。在这些情况下,开发人员需要想出一些方法来使增强用户体验,或者说至少通知用户。
在本文中,我们将看到如何检测Swift中的Internet连接问题,以及我们可以处理它的一些方法。以下是我们将要构建的示例应用程序以及它如何处理不同的Internet连接方案:
前提
为了能够在本文中进行操作,您需要满足以下要求:
- Xcode已经安装
- 具备基本的swift语言
- Cocoapods已经安装
初始化新建一个工程
Swift有自带的Reachability实现来检测网络连接问题,但这里将使用第三方库(https://github.com/tonymillion/Reachability)。这样做是因为它更容易,API比内置的更具表现力。
打开Xcode并设置一个新项目
要检测连接何时脱机,我们将使用Reachability.swift (https://github.com/ashleymills/Reachability.swift) ****包。
打开终端并运行以下命令:
$ pod init
这将创建一个新的Podfile,我们可以在其中声明Cocoapods依赖项。打开Podfile并使用以下代码替换内容:
platform :ios, '9.0'target 'project_name' do use_frameworks! pod 'ReachabilitySwift' pod 'Alamofire'end
您需要将** project_name **替换为你自己创建项目名称。
保存文件并运行以下命令将Pod安装到项目中:
$ pod install
安装完成后,打开项目根目录中的* .xcworkspace文件。启动Xcode。
创建我们的网络可达性管理器
创建一个新的NetworkManager类。此类将存储网络状态,并且是Reachability包的简单代理。在文件中,粘贴以下代码:
import Foundationimport Reachabilityclass NetworkManager: NSObject { var reachability: Reachability! static let sharedInstance: NetworkManager = { return NetworkManager() }() override init() { super.init() // Initialise reachability reachability = Reachability()! // Register an observer for the network status NotificationCenter.default.addObserver( self, selector: #selector(networkStatusChanged(_:)), name: .reachabilityChanged, object: reachability ) do { // Start the network status notifier try reachability.startNotifier() } catch { print("Unable to start notifier") } } @objc func networkStatusChanged(_ notification: Notification) { // Do something globally here! } static func stopNotifier() -> Void { do { // Stop the network status notifier try (NetworkManager.sharedInstance.reachability).startNotifier() } catch { print("Error stopping notifier") } } // Network is reachable static func isReachable(completed: @escaping (NetworkManager) -> Void) { if (NetworkManager.sharedInstance.reachability).connection != .none { completed(NetworkManager.sharedInstance) } } // Network is unreachable static func isUnreachable(completed: @escaping (NetworkManager) -> Void) { if (NetworkManager.sharedInstance.reachability).connection == .none { completed(NetworkManager.sharedInstance) } } // Network is reachable via WWAN/Cellular static func isReachableViaWWAN(completed: @escaping (NetworkManager) -> Void) { if (NetworkManager.sharedInstance.reachability).connection == .cellular { completed(NetworkManager.sharedInstance) } } // Network is reachable via WiFi static func isReachableViaWiFi(completed: @escaping (NetworkManager) -> Void) { if (NetworkManager.sharedInstance.reachability).connection == .wifi { completed(NetworkManager.sharedInstance) } }]
在上面的类中,我们定义了几个帮助我们开始进行网络状态监控的辅助函数。我们有一个单独的sharedInstance,如果我们不想创建NetworkManager类的多个实例,我们可以调用它。
在init方法中,我们创建了一个Reachability实例,然后使用NotificationCenter类注册通知。现在,每次网络状态发生变化时,都会调用NotificationCenter指定的回调(即networkStatusChanged)。我们可以使用它来执行在网络无法访问时激活的全局内容。
我们已经定义了其他网络函数,这些函数通常会根据我们的Internet连接状态轻松运行代码,*isReachable*, *isUnreachable*, *isReachableViaWWAN* 和 *isReachableViaWiFi*。
简单使用:
NetworkManager.isReachable { networkManagerInstance in print("Network is available")}NetworkManager.isUnreachable { networkManagerInstance in print("Network is Unavailable")}
注意这不是一个事件监听器,只会运行一次。要使用侦听器实时获取网络更改,您需要使用NetworkManager.sharedInstance.reachability.whenReachable **。
在应用程序启动时处理网络可用
有时,应用程序很大程度上依赖于Internet连接,您需要在启动时检测状态,让我们看看如何使用NetworkManager类来处理这个问题。
创建一个名为LaunchViewController的新控制器。我们将故事板上的第一个控制器视图视为启动控制器。我们将尝试检测用户的设备是否在线,如果没有,我们将创建一个离线页面来处理这个问题,以便用户根本不会进入应用程序。
在LaunchController中,使用以下代码替换内容:
import UIKitclass LaunchViewController: UIViewController { let network: NetworkManager = NetworkManager.sharedInstance override func viewDidLoad() { super.viewDidLoad() NetworkManager.isUnreachable { _ in self.showOfflinePage() } } private func showOfflinePage() -> Void { DispatchQueue.main.async { self.performSegue( withIdentifier: "NetworkUnavailable