iOS print without allowing UIPrintInteractionController to appear

airprint, ios, ipad, iphone, printing

Solution

As far as I know it is not possible to print in iOS7 without invoking the `UIPrintInteractionController` and displaying the system print dialog.

However, iOS8 now provides a provision for printing directly to a print without showing the dialog. The basic idea is that you obtain a `UIPrinter` object and use this in conjunction with the new `- printToPrinter:completionHandler:` method of the `UIPrintInteractionController` to print without showing the dialog.

Obtaining the `UIPrinter` object for your printer can be accomplished in a couple of ways.

The most straightforward is to use the new `UIPrinterPickerController`. But this would show a dialog and so doesn’t meet your needs.

The alternative is to create a printer via its URL using the `UIPrinter` method `+ printerWithURL:`. I’m not entirely clear how to obtain this URL but it may be contained in the printer’s HTML admin pages. And I believe you can obtain it programmatically using the Bonjour API. More info here:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/NetServices/Introduction.html#//apple_ref/doc/uid/10000119i

Bonjour is a service discovery API which includes discovery of IPP printers, which the is the protocol used by AirPrint.

As for how the Printer Pro app is able to print without a dialog in iOS7, I would guess they are interacting with the printer at a very low level (e.g. raw HTTP posts, etc.).

Problem

I am researching a potential app for a client, and I had a question I wasn't able to find the answer on. What I would like to do is print automatically, without having the `UIPrintInteractionController` get displayed. An important point I should make is this will not be a production app. I know that otherwise this could violate the user's privacy to just print without the user's consent, but again this will not be a public app on the App Store. One app I found that seems to be able to this is `Printer Pro`. The user is prompted to print a test page, and the page prints without the `UIPrintInteractionController` appearing - this app is on the store, so I'm assuming there's a legal way to do it. Anyone know how this is done?

Original source