7

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

4

2 回答 2

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 使用的协议。

至于打印机 Pro 应用程序如何能够在 iOS7 中不使用对话框进行打印,我猜他们是在非常低的级别与打印机交互(例如原始 HTTP 帖子等)。

于 2014-10-08T17:56:33.477 回答
3

请按照以下步骤在不提示的情况下打印文档..

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

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);
            }
        }];
    }
}
于 2016-11-15T12:55:53.880 回答