bonjour-http
这个库使得在 Apple 设备(Mac、iPhone、iPad 和 Apple TV)之间使用 Bonjour 连接,并同时使用 HTTP 作为应用层协议变得简便。
它还提供了一个 http-call 包装器,允许客户端异步地从服务器端调用的特定函数并接收结果。
// Client-side
connection.call("greeting", params: ["message": "How are you?"]) { (res, json) in
if res.isSuccess {
// process the response
...
}
}
// Server-side
func service(_ service: BonjourService, onCall: String, params: [String : Any],
socket: GCDAsyncSocket, context: String) {
switch(onCall) {
case "greeting":
service.respond(to: socket, context: context,
result: ["message": "I'm fine, thank you."])
default:
// handle error
...
}
}
为什么使用 HTTP?
Bonjour 是一种建立本地网络中设备之间连接的优秀机制,但它没有指定如何发送各种类型的数据,如文本、JSON 数据和图像。使用 HTTP 是合理的,因为 HTTP 不仅在浏览器和 Web 服务器之间广泛使用,而且还在应用和 Web 服务之间使用。
客户端类
BonjourBrowser 允许一个应用程序发现具有特定类型的 Bonjour 服务(NetService 对象),并将它们呈现给用户进行选择(注意:此库没有 UI 代码)。
BonjourConnection 允许一个应用程序在用户选择的 Bonjour 服务之间建立连接。应用程序通过调用其 send(req:callback:) 方法或 call(req:name:params:callback) 方法向连接的服务器发送 HTTP 请求,然后异步接收响应。
BonjourConnectionDelegate 是一个应用程序可能实现的协议,用于接收由 callback 函数未处理的 send 和 call 方法的响应。
BonjourRequest 表示一个 HTTP 请求,由应用程序创建并通过已建立的 BonjourConnection 发送。
BonjourResponse 表示从 Bonjour 服务器返回的 HTTP 响应。
服务器类
BonjourService 允许应用程序发布特定类型的 Bonjour 服务。应用程序需要定义一个表示 HTTP 服务器的类,该类实现 BonjourServiceDelegate 协议。
BonjourRequest 表示从客户端应用程序发送的 HTTP 请求。服务器通过 BonjourServiceDelegate 协议的 service:onRequest:socket:context 方法接收它。
BonjourResponse 表示服务器应用程序创建的 HTTP 响应,作为对客户端应用程序发送的 HTTP 请求的响应。
以下是一个示例,它返回根目录("/")的 "Hello World!" 页面。
class SampleHTTPServer : NSObject, BonjourServiceDelegate {
func service(_ service: BonjourService, onRequest req: BonjourRequest, socket: GCDAsyncSocket, context: String) {
var res = BonjourResponse(context: context)
switch(req.path) {
case "/":
res.setBody(string: "<html><body>Hello World!</body></html>")
default:
res.setBody(string: "<html><body>Page Not Found</body></html>")
res.statusText = "404 Not Found"
}
service.send(responce: res, to: socket)
}
}
CocoaPods
从这个仓库生成两个 cocoa pods。
- https://cocoapods.org.cn/pods/bonjour-http(客户端 & 服务器)
- https://cocoapods.org.cn/pods/bonjour-http-server(仅服务器)
仅服务器版本的目的是用于针对 10.14 的 MacOS 应用程序。客户端代码使用 ObservableObject 协议和 @Published 前缀以支持 SwiftUI,该协议可在 MacOS 10.15 及更高版本上使用。