如何从网络服务获取打印机 URL



我正在尝试使用这种方式获取所有本地打印机;

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)
} 
}

最新更新