如何从NetService获取打印机URL

时间:2018-05-22 09:52:55

标签: ios swift nsnetservice

我正试图通过这种方式获取所有本地打印机;

let serviceBrowser = NetServiceBrowser()
serviceBrowser.delegate = self
serviceBrowser.schedule(in: .current, forMode: .defaultRunLoopMode)
serviceBrowser.searchForServices(ofType: "_ipp._tcp.", inDomain:"local.")

它找到所有已连接的打印机,但我想知道它们的网址是否用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不是解决方案的选项。

1 个答案:

答案 0 :(得分:1)

找到网络服务后,您需要resolve。然后,您可以执行类似的操作来构建要发送到AirPrint的UIPrinter。

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对象中的type字段来确定使用哪个。
  • 主机:NetService对象中的主机名字段
  • 端口: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)
     } 
}