使用 Bonjour 配合 Sublimation,以便自动发现您的 Swift 服务器。
sequenceDiagram
participant Server as Hummingbird/Vapor Server
participant BonjourSub as BonjourSublimatory
participant NWListener as NWListener
participant Network as Local Network
participant BonjourClient as BonjourClient
participant App as iOS/watchOS App
Server->>BonjourSub: Start server, provide IP addresses,<br/>hostnames, port, and protocol (http/https)
BonjourSub->>NWListener: Configure with server information
NWListener->>Network: Advertise service:<br/>1. Send encoded server data<br/>2. Use Text Record for additional info
App->>BonjourClient: Request server URL
BonjourClient->>Network: Search for advertised services
Network-->>BonjourClient: Return advertised service information
BonjourClient->>BonjourClient: 1. Receive and decode server data<br/>2. Parse Text Record
BonjourClient-->>App: Return AsyncStream<URL><br/>or first available URL
App->>Server: Connect to server using discovered URL
当 Swift 服务器启动时,它会告知 Sublimation 可用于访问服务器的 IP 地址或主机名(包括端口号以及是否使用 https 或 http)。 这被称为 BonjourSublimatory
。 然后 BonjourSublimatory
使用 NWListener
通过以 Protocol Buffers 编码的数据以及 Text Record 中公布的信息来广播此信息。
iPhone 或 Apple Watch 然后使用 BonjourClient
来获取 URL
的 AsyncStream
(通过 BonjourClient.urls
) 或直接获取可用的 BonjourClient.first()
。
Apple 平台
Linux
要使用 SPM 将 SublimationBonjour 集成到您的应用程序中,请在您的 Package.swift 文件中指定它
let package = Package(
...
dependencies: [
.package(url: "https://github.com/brightdigit/SublimationBonjour.git", from: "1.0.0")
],
targets: [
.target(
name: "YourServerApp",
dependencies: [
.product(name: "SublimationBonjour", package: "SublimationBonjour"), ...
]),
...
]
)
创建一个带有以下内容的 BindingConfiguration
:
let bindingConfiguration = BindingConfiguration(
host: ["Leo's-Mac.local", "192.168.1.10"],
port: 8080
isSecure: false
)
使用该 BindingConfiguration
创建一个 BonjourSublimatory
,并包含您服务器的 logger。 然后将其附加到 Sublimation
对象
let bonjour = BonjourSublimatory(
bindingConfiguration: bindingConfiguration,
logger: app.logger
)
let sublimation = Sublimation(sublimatory : bonjour)
您也可以只创建一个 Sublimation
对象
let sublimation = Sublimation(
bindingConfiguration: bindingConfiguration,
logger: app.logger
)
在设备上,创建一个 BonjourClient
,并通过 BonjourClient.urls
获取 URL
对象的 AsyncStream
,或者直接使用 BonjourClient.first()
请求第一个 URL。
let client = BonjourClient(logger: app.logger)
let hostURL = await client.first()
要了解更多信息,请查看完整的文档。
此代码在 MIT 许可证下分发。 有关更多信息,请参见 LICENSE 文件。