Use Bonjour for Sublimation for automatic discovery of your Swift Server.
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
When the Swift Server begins it will tell Sublimation the ip addresses or host names which are available to access the server from (including the port number and whether to use https or http). This is called a BonjourSublimatory. The BonjourSublimatory then uses NWListener to advertise this information both by send the data encoded using Protocol Buffers as well as inside the Text Record advertised.
The iPhone or Apple Watch then uses a BonjourClient to fetch either an AsyncStream of URL via BonjourClient.urls or simply get the BonjourClient.first() one available.
Apple Platforms
- Xcode 16.0 or later
- Swift 6.0 or later
- iOS 17 / watchOS 10.0 / tvOS 17 / macOS 14 or later deployment targets
Linux
- Ubuntu 20.04 or later
- Swift 6.0 or later
To integrate SublimationBonjour into your app using SPM, specify it in your Package.swift file:
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"), ...
]),
...
]
)Create a BindingConfiguration with:
- a list of host names and ip address
- port number of the server
- whether the server uses https or http
let bindingConfiguration = BindingConfiguration(
host: ["Leo's-Mac.local", "192.168.1.10"],
port: 8080
isSecure: false
)Create a BonjourSublimatory using that BindingConfiguration and include your server's logger. Then attach it to the Sublimation object:
let bonjour = BonjourSublimatory(
bindingConfiguration: bindingConfiguration,
logger: app.logger
)
let sublimation = Sublimation(sublimatory : bonjour)You can also just create a Sublimation object:
let sublimation = Sublimation(
bindingConfiguration: bindingConfiguration,
logger: app.logger
)On the device, create a BonjourClient and either get an AsyncStream of URL objects via BonjourClient.urls or just ask for the first one using BonjourClient.first():
let client = BonjourClient(logger: app.logger)
let hostURL = await client.first()To learn more, check out the full documentation.
This code is distributed under the MIT license. See the LICENSE file for more info.