iOS打印不允许uiprintinteractionController出现



我正在研究客户的潜在应用,我有一个问题,我无法找到答案。我想做的就是自动打印,而无需显示UIPrintInteractionController。我应该提出的一个重要的一点是,这个不会是生产应用程序。我知道,否则,这可能会违反用户的隐私,只需未经用户的同意即可打印,但这再次不是应用商店中的公共应用程序。我发现似乎可以这样做的一个应用程序是Printer Pro。提示用户打印一个测试页面,并且该页面在没有UIPrintInteractionController出现的情况下打印 - 此应用程序在商店中,因此我假设有一种合法的方法可以做到这一点。有人知道这是如何完成的吗?

据我所知,在不调用UIPrintInteractionController并显示"系统打印对话框"的情况下,不可能在ios7中打印。

但是,IOS8现在提供了直接打印到打印的规定,而无需显示对话框。基本思想是,您获得了一个UIPrinter对象,并将其与新的- printToPrinter:completionHandler:方法一起使用UIPrintInteractionController的新方法,而无需显示对话框。

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

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

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

https://developer.apple.com/library/ios/documentation/cocoa/coneptual/netservices/introduction.html#//apple_ref/doc/doc/uid/1000000119i

Bonjour是一个服务发现API,其中包括IPP打印机的发现,这是Airprint使用的协议。

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

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

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

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

最新更新