Hyperconnectivity

Build Status Version Carthage compatible License Twitter

Hyperconnectivity 是 Reachability 的现代替代品,完全使用 Swift 编写,并使用 Apple 的 Combine 框架。它提供了检测网络可达性、互联网连接以及 强制门户 存在的能力。它是 Connectivity 项目的分支,该项目提供类似的功能。要了解哪个更适合您,请查看下面的 Connectivity 与 Hyperconnectivity 对比 部分。

功能

快速入门

入门非常简单,只需按如下方式订阅提供的 publisher

cancellable = Hyperconnectivity.Publisher()
	.receive(on: DispatchQueue.main)
	.eraseToAnyPublisher()
	.sink(receiveCompletion: { [weak self] _ in
		self?.updateUIWhenComplete()
	}, receiveValue: { [weak self] connectivityResult in
		self?.updateUI(with: connectivityResult)
	})

有关完整示例,请参阅示例应用程序中的示例 UIViewController

Connectivity 与 Hyperconnectivity 对比

Hyperconnectivity 是 Connectivity 框架的分支,那么您为什么要选择 Hyperconnectivity 而不是 Connectivity 呢?

TL;DR(太长不看)

随着 iOS 14 即将到来,Hyperconnectivity 放弃了 Objective-C 互操作性和 Connectivity 提供的对旧版本 iOS 的支持,以便为那些只需要支持 iOS 13 及更高版本的应用程序提供更简洁、更优雅的 Swift 接口。

Connectivity 旨在为 Apple 的 Reachability 用户提供熟悉的 API,Reachability 是用 Obj-C 编写的,其设计深受该语言的影响。随着 Swift 语言的许多最新进展以及 iOS 12 和 13 中分别引入的 Network 和 Combine 框架,感觉有机会以牺牲 Obj-C 兼容性和对旧版本 iOS 的支持为代价,提供一个更“Swift 化”和更具反应性的接口。

功能对比

下表将随着 Hyperconnectivity 未来版本的发布而更新,使该框架在功能上与 Connectivity 达到同等水平。

Comparison with Connectivity Table

安装

Hyperconnectivity 与 Cocoapods、Carthage 和 Swift Package Manager 兼容。有关安装说明,请查看下面的相关部分。

Cocoapods

CocoaPods 是一个依赖管理器,它将依赖项集成到您的 Xcode 工作区中。要使用 Ruby gems 安装它,请运行

gem install cocoapods

要使用 Cocoapods 安装 Hyperconnectivity,只需将以下行添加到您的 Podfile 中

pod "Hyperconnectivity"

然后运行命令

pod install

有关更多信息,请参见此处

Carthage

Carthage 是一个依赖管理器,它生成一个二进制文件,用于手动集成到您的项目中。可以通过 Homebrew 使用以下命令安装它

brew update
brew install carthage

为了通过 Carthage 将 Hyperconnectivity 集成到您的项目中,请将以下行添加到您的项目的 Cartfile 中

github "rwbutler/Hyperconnectivity"

从 macOS 终端运行 carthage update --platform iOS 以构建框架,然后将 Hyperconnectivity.framework 拖到您的 Xcode 项目中。

有关更多信息,请参见此处

Swift Package Manager

Xcode 11 包括对 Swift Package Manager 的支持。为了在 Xcode 11 中将 Hyperconnectivity 添加到您的项目中,从 File 菜单中选择 Swift Packages,然后选择 Add Package Dependency

对话框将请求软件包存储库 URL,即

https://github.com/rwbutler/hyperconnectivity

验证 URL 后,Xcode 将提示您选择是将特定分支、提交还是版本化版本拉取到您的项目中。

Xcode 11 Package Options

继续下一步,您将被要求选择要集成到目标中的软件包产品。将有一个名为 Hyperconnectivity 的软件包产品,应预先选择它。确保从对话框的最右侧列中选择您的主应用程序目标,然后单击“完成”以完成集成。

Xcode 11 Add Package

工作原理

iOS 采用了一种名为无线互联网服务提供商漫游 (WISPr 2.0) 的协议,该协议由 无线宽带联盟 发布。该协议定义了智能客户端到接入网关接口,描述了如何使用 通用访问方法 对访问公共 IEEE 802.11 (Wi-Fi) 网络的用户进行身份验证,其中强制门户向用户呈现登录页面。

然后,用户必须通过 Web 浏览器注册或提供登录凭据,以便使用 RADIUS 或其他协议提供集中式身份验证、授权和计费 (AAA) 来获得网络访问权限。

为了检测到它已连接到具有强制门户的 Wi-Fi 网络,iOS 会联系 Apple 托管的多个端点 - 例如 https://www.apple.com/library/test/success.html。每个端点都托管一个小的 HTML 页面,格式如下

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
	<TITLE>Success</TITLE>
</HEAD>
<BODY>
	Success
</BODY>
</HTML>

如果在下载此小 HTML 页面时,iOS 发现它包含如上所示的单词 Success,那么它就知道互联网连接可用。但是,如果强制门户呈现登录页面,则不会出现单词 Success,iOS 将意识到网络连接已被强制门户劫持,并将呈现一个浏览器窗口,允许用户登录或注册。

Apple 托管了许多此类页面,这样,如果其中一个页面出现故障,则可以检查许多备用页面,以确定是否存在连接,或者我们的连接是否被强制门户阻止。不幸的是,iOS 没有向开发人员公开任何框架,使我们能够利用操作系统对强制门户的感知。

Hyperconnectivity 是一个开源框架,致力于复制 iOS 检测强制门户的方式。当 NWPathMonitor 检测到 Wi-Fi 或 WWAN 连接时,Hyperconnectivity 会联系多个端点,以确定是否存在真正的互联网连接,或者强制门户是否正在拦截连接。这种方法也可用于确定 iOS 设备是否连接到没有互联网接入的 Wi-Fi 路由器。

Hyperconnectivity 提供了一个 Combine Publisher,用于提供互联网连接状态更改的通知,因此,对于任何有使用 Combine publisher 先前经验的人来说,快速上手该框架应该很简单。

默认情况下,Hyperconnectivity 联系 iOS 已经使用的多个端点,但建议将这些端点替换为开发人员托管的端点,方法是设置 Hyperconnectivity.Configuration 对象的 connectivityURLs 属性。可以通过设置此对象的 successThreshold 属性进行进一步自定义,该属性确定为了得出存在连接的结论,联系的端点中必须成功检查的百分比。默认值指定联系的 URL 中必须有 50% 成功通过连接检查。

用法

有关如何使用 Hyperconnectivity 的示例,请参阅 Example 目录中的示例应用程序。提供的示例 UIViewController 说明了如何使用 publisher 更新您的 UI。

常见问题解答

Hyperconnectivity 的发布是否意味着 Connectivity 在未来将不再受支持?

不,Connectivity 和 Hyperconnectivity 在未来都将受到支持,每个框架的改进都将是共生的,从而导致另一个框架的改进。

已知问题

调用者负责保留 AnyCancellable 对象

请确保任何使用此框架的实现都持有对订阅 publisher 时返回的 AnyCancellable 对象的强引用。如果未保留此对象,则任何互联网连接检查都将过早取消。

模拟器问题

在报告错误之前,请确保您已在物理设备上进行了测试,因为在模拟器上,网络适配器状态的更改无法由 iOS 框架正确报告,尤其是在从断开连接 -> 连接状态转换时。此行为在物理设备上可以正常工作。

作者

Ross Butler

许可证

Hyperconnectivity 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件

附加软件

控件

AnimatedGradientView
AnimatedGradientView

框架

Cheats Connectivity FeatureFlags Hyperconnectivity Skylark TypographyKit Updates
Cheats Connectivity FeatureFlags Hyperconnectivity Skylark TypographyKit Updates

工具

Config Validator IPA Uploader Palette
Config Validator IPA Uploader Palette