我正在尝试使用这种方式获取所有本地打印机;
let serviceBrowser = NetServiceBrowser()
serviceBrowser.delegate = self
serviceBrowser.schedule(in: .current, forMode: .defaultRunLoopMode)
serviceBrowser.searchForServices(ofType: "_ipp._tcp.", inDomain:"local.")
它找到所有连接的打印机,但我想知道它们的网址,以便使用类似 URL 的 URL 创建UIPrinter
,例如UIPrinter(url: URL("urlstring"))
func netServiceBrowser(_ browser: NetServiceBrowser, didFind service: NetService, moreComing: Bool) {
print(service)
// output: <NSNetService 0x1c0228960> local. _ipp._tcp. RICOH imagio MP C3302 [002673499B5F] -1
}
我不知道使用这种方式是否是查找本地/空气打印机的解决方案。
注意:UIPrinterPickerController
不是解决方案的选项。
找到网络服务后,您需要解析它们。然后你可以做这样的事情来构建一个UIPrinter发送到AirPrint。
let printerPath = "(uri)://(host):(port)/" + (service.textRecordField(field: "rp") ?? "")
guard let printerUrl = URL(string: printerPath)
else { return nil }
let printer = UIPrinter(url: printerUrl)
- URI: "IPP", "IPPS", "LPD", "SOCKET"。您可以通过检查 NetService 对象的类型字段来确定要使用的字段。
- host:NetService 对象中的主机名字段 端口
- :网络服务对象中的端口名称字段
- rp:打印机的队列名称(路径(。您可以通过从 NetService 对象的文本记录字典中解码"rp"字段来获得此字段。
这是我从NetService对象获取txtRecord数据的扩展:
extension NetService {
func textRecordField(field: String) -> String?
{
guard
let data = self.txtRecordData(),
let field = NetService.dictionary(fromTXTRecord: data)[field]
else { return nil }
return String(data: field, encoding: String.Encoding.utf8)
}
}