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 服务中广泛使用。
客户端类
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响应作为对客户端应用程序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
该仓库生成两个 CocoaPods。
- https://cocoapods.org.cn/pods/bonjour-http(客户端 & 服务器)
- https://cocoapods.org.cn/pods/bonjour-http-server(仅服务器)
仅服务器版本适用于针对 MacOS 10.14 的应用程序。客户端代码使用 ObservableObject 协议和 @Published 前缀以支持 SwiftUI,这是一种在 MacOS 10.15 及更高版本上可用的技术。