2012-10-30 42 views
6

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

+0

曾经得到一个答案? –

+0

不幸的是,没有。这里是一个相关链接http://stackoverflow.com/questions/5135781/ipad-iphone-printing-directly-to-a-network-printer-without-airprint-popover?rq=1 – coder

回答

5

据我知道这是不可能的iOS7打印,而不必调用UIPrintInteractionController和显示系统打印对话框。

但是,iOS8现在提供了直接打印到打印而不显示对话框的规定。其基本思想是,你获得UIPrinter对象,并结合使用与UIPrintInteractionController- printToPrinter:completionHandler:方法,而不显示对话框进行打印。

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

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

另一种方法是使用UIPrinter方法 + printerWithURL:通过其URL创建打印机。我不完全清楚如何获取此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等)。

+0

这工作得很好,貌似除了打印机共享杯(即在Ubuntu的)。例如,我无法通过printToPrinter打印到与ubuntu/CUPS共享的两台打印机:在我的应用程序中,但我的应用程序可以直接打印到我的两台佳能CP910打印机。同时,原生的Photos应用程序可以打印到我的2台由ubuntu/CUPS共享的打印机。所以没有一切工作与printToPrinter: – xaphod

+0

更新:我找到了解决方法是同时存储的URL打印机和强大的参考UIPrinter为好。如果URL无法连接,请直接尝试UIPrinter。令人惊讶的是这个工程...看起来像一个iOS 8的错误,因为没有理由不能使用URL AFAIK – xaphod

0

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

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

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

编辑帖子并缩进代码(代码按钮) –