如何在你的 App 中使用组播网络
2020 年 6 月 22 日
App 使用组播网络来查看本地网络上的其他设备,并与它们进行通信。例如,某个 App 可能会发现连接到某人 Wi-Fi 网络的智能灯泡,并通过发送信息来将它们打开或关闭。虽然发现本地网络上的所有设备并与之通信的能力是一个强大的工具,但这些设备可能携带敏感的个人信息,可用于建立营销档案或预测人们何时可能在家。
iOS 14 通过通知人们何时有 App 要访问他们的本地网络,并让他们能随时阻止或撤销这类访问,从而让这些行为透明且可控。
注:此隐私控制仅适用于访问直接网络上的设备,并不限制 App 访问互联网。
如果你需要与需使用组播或广播网络的设备和协议进行交互,请确保更新你的 App 以支持 iOS 和 iPadOS 中添加的最新隐私保护措施。
组播网络入门
组播网络通常用于发现协议,让你识别网络上的其他设备,或用于向同一网络上的许多主机批量传送数据。由于 Wi-Fi 网络的运作方式,使用组播进行批量数据传输的效率会很低,所以组播应该用于短期、有限的业务。
Apple 平台提供了对跨平台发现协议 Bonjour 的内置支持,它在其他平台上也被称为“组播DNS”、“mDNS”或“DNS 服务发现”。各大平��都内置了 Bonjour。
每当你需要发现或连接到你网络上的其他设备时,都可以使用 Bonjour。Network.framework 中的 NWBrowser 让你可以很容易地发现网络上的其他 Bonjour 服务,并建立 NWConnection 对象与它们进行通信。当你想让别人找到并连接到你的时候,还可以使用 NWListener 来宣传 Bonjour 服务。
Building a custom peer-to-peer protocol
在设备发现过程中保护隐私
如果你的 App 目前使用 Bonjour 来发现本地网络上的设备,那么整合 iOS 14 的隐私控制会很容易。
提供上下文
如果你正在使用 Bonjour,请在你 App 的 Info.plist
中声明你使用的服务。
* 你是否需要支持过往设备?*
保持与一些过往设备和软件的兼容性可能需要使用自定义的组播和广播协议。由于这些功能让你的 App 可以完全访问用户的本地网络,因此这种访问需要 com.apple.developer.networking.multicast
限制性权限。
注:你可以在没有有效权限的情况下使用 iOS 和 iPadOS 模拟器测试你的 App,但在物理硬件上使用组播和广播网络需要权限。
Request the com.apple.developer.networking.multicast entitlement
用 NWConnectionGroup 发送和接收组播数据包。
如果你的 App 有 com.apple.developer.networking.multicast
权限,就可以使用 NWConnectionGroup
在 Swift 中使用 Network.framework 干净利落地发送和接收组播数据包。
要做到这一点,首先创建一个 NWMulticastGroup
来描述你��加入的组播组。
```swift
guard let multicast = try? NWMulticastGroup(for:
[ .hostPort(host: "224.0.0.251", port: 5353) ])
else { fatalError(...) }
设置 newMessageHandler
来接收发送到组播组的数据包,并可选择发送消息作为回复。
```swift
group.setReceiveHandler(maximumMessageSize: 16384, rejectOversizedMessages: true) { (message, content, isComplete) in
print("Received message from \(String(describing: message.remoteEndpoint))")
let sendContent = Data("ack".utf8)
message.reply(content: sendContent)
}
```
就像其他 Network.framework 对象一样,NWConnectionGroup
有一个状态更新处理程序,它将在你传递给 start()
的 DispatchQueue
上被调用。
```swift
group.stateUpdateHandler = { (newState) in
print("Group entered state \(String(describing: newState))")
}
group.start(queue: .main)
当你想向该组发送消息时,使用 send()
。为了不使网络过载,请在上一次发送的完成处理程序中安排后续的发送。
```swift
let groupSendContent = Data("helloAll".utf8)
group.send(content: groupSendContent) { (error)
print("Send complete with error \(String(describing: error))")
}
```
当你处理完 NWConnectionGroup
后,取消它来清理所有相关的状态。
```swift
group.cancel()
```
保护所有人的安全和隐私
本地网络隐私是让你能使你的 App 对用户来说更安全、更有保障的另一种方式。与 Apple 平台中的其他隐私控制一起,针对人们分享的内容和时机而言,本地网络保护有助于给他们更多的控制和上下文。你可以通过这几种方式来保护你用户的隐私:使用 Bonjour 来发现网络上的设备;在你的 Info.plist
中列出你使用的服务;提供一个原因字符串来帮助用户了解你在他们的网络上做了什么。