ios - 如何从 NetService 获取打印机 URL

标签 ios swift nsnetservice

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

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

它找到了所有已连接的打印机,但我想知道它们的 url 以创建 UIPrinter ,其 URL 类似于 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 不是解析的选项。

最佳答案

您需要 resolve找到它们后的网络服务。然后你可以做这样的事情来构建一个 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”、“套接字”。您可以通过检查 NetService 对象的类型字段来确定使用哪个。
  • host:来自 NetService 对象的主机名字段
  • port:来自 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)
     } 
}

关于ios - 如何从 NetService 获取打印机 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50464724/

相关文章:

swift - 使用 Swift 的 Bonjour 服务浏览器不获取服务信息

ios - 了解 NSNetservice 的 “includesPeerToPeer” 属性

ios - 从对象中解析特定字段

ios - 使用 Swift 在 iOS 11 中向 NSAttributedString 添加删除线

ios - CLPlacemark 'name' 返回街道地址,而 'thoroughfare' 仅返回街道名称

iphone - 使用 NSNetService 类与 Windows 计算机上共享的文件夹建立 SMB tcp ip 连接

ios - SKPhysicsJointFixed.joint 减慢 Sprite

ios - iOS 是否保留 View 实例?

ios - 无法获取数据。或者在 TableView 中获取两次相同的数据

ios - 在使用 google 登录和 facebook 登录我的 ios 应用程序时 - 如何将两种 viewDidLoad() 方法的代码合并为一个?