iOS打印不允许出现UIPrintInteractionController

时间:2012-10-30 18:47:33

标签: iphone ios ipad printing airprint

我正在为客户研究一个潜在的应用程序,我有一个问题,我无法找到答案。我想要做的是自动打印,而不显示UIPrintInteractionController。我应该做的一个重点是不会成为一个生产应用程序。我知道,否则这可能会违反用户的隐私,只是在未经用户同意的情况下进行打印,但这又不会是App Store上的公共应用程序。我发现的一个应用程序似乎能够Printer Pro。提示用户打印测试页面,页面打印时没有出现UIPrintInteractionController - 此应用程序在商店中,所以我假设有合法的方法来执行此操作。有谁知道这是怎么做的?

2 个答案:

答案 0 :(得分:7)

据我所知,如果不调用UIPrintInteractionController并显示系统打印对话框,则无法在iOS7中打印。

但是,iOS8现在提供了直接打印到打印而不显示对话框的规定。基本的想法是,您获取UIPrinter对象,并将其与- printToPrinter:completionHandler:的新UIPrintInteractionController方法结合使用,以便在不显示对话框的情况下进行打印。

获取打印机的UIPrinter对象可以通过几种方式完成。

最直接的方法是使用新的UIPrinterPickerController。但这会显示一个对话框,因此无法满足您的需求。

另一种方法是使用UIPrinter方法通过其URL创建打印机 + printerWithURL:。我不完全清楚如何获取此URL,但它可能包含在打印机的HTML管理页面中。我相信您可以使用Bonjour API以编程方式获取它。更多信息:

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

Bonjour是一种服务发现API,包括发现IPP打印机,这是AirPrint使用的协议。

至于Printer Pro应用程序如何在iOS7中没有对话框的情况下进行打印,我猜他们会以非常低的级别与打印机进行交互(例如原始HTTP帖子等)。

答案 1 :(得分:1)

按照以下步骤打印文档而不提示..

首先使用以下代码搜索设备...

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];
            }
    }];
}

使用以下代码在没有提示的情况下打印文档...

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);
            }
        }];
    }
}