Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS print without allowing UIPrintInteractionController to appear

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?

like image 591
coder Avatar asked Oct 30 '12 18:10

coder


People also ask

Can you see printer queue on iPhone?

See the status of a print jobOpen the App Switcher, then tap Print Center. The badge on the icon shows how many documents are in the queue. To cancel a print job, select it in Print Center, then tap Cancel Printing.


2 Answers

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

like image 160
jbtrask Avatar answered Sep 28 '22 17:09

jbtrask


Follow these steps to Print the Documents without prompting..

First Search for Devices Using the Below Code...

if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) {
    UIPrinterPickerController *printPicker = [UIPrinterPickerController printerPickerControllerWithInitiallySelectedPrinter:nil];

    [printPicker presentAnimated:YES completionHandler:
        ^(UIPrinterPickerController *printerPicker, BOOL userDidSelect, NSError *error) {

            if (userDidSelect) {
                //User selected the item in the UIPrinterPickerController and got the printer details.

                [UIPrinterPickerController printerPickerControllerWithInitiallySelectedPrinter:printerPicker.selectedPrinter];

                // Here you will get the printer and printer details.ie,
                // printerPicker.selectedPrinter, printerPicker.selectedPrinter.displayName, printerPicker.selectedPrinter.URL etc. So you can display the printer name in your label text or button title.

                NSURL *printerURL = printerPicker.selectedPrinter.URL;

                NSLog(@"printerURL--->%@",printerURL.absoluteString);

                NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
                [defaults setObject:[printerURL absoluteString] forKey:@"printURL"];
                [defaults synchronize];
            }
    }];
}

And Print the Documents by without prompting by using the below code...

if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1) {
   NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

   UIPrinter *currentPrinterObj = [UIPrinter printerWithURL:[NSURL URLWithString:[defaults stringForKey:[defaults stringForKey:@"printURL"]]]];

   UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];

   if(currentPrinterObj) {
        [controller printToPrinter:currentPrinterObj completionHandler:^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
            if(completed) {

            } else {
                NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, error.code);
            }
        }];
    }
}
like image 36
Victor Sebastian Avatar answered Sep 28 '22 18:09

Victor Sebastian