Как получить URL-адрес принтера от NetService - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь получить все локальные принтеры, используя этот способ;

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 не является опцией для разрешения.

1 Ответ

0 голосов
/ 18 октября 2018

Вам нужно будет разрешить сетевые сервисы после того, как вы их найдете.Затем вы можете сделать что-то вроде этого, чтобы создать 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
  • port: поле имени порта из объекта NetService
  • rp: имя очереди (путь) принтера.Вы получите это, расшифровав поле 'rp' из словаря текстовых записей объекта NetService.

Вот мое расширение для получения данных txtRecord из объекта NetService:

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