我正在为客户研究一个潜在的应用程序,我有一个问题,我无法找到答案。我想要做的是自动打印,而不显示UIPrintInteractionController
。我应该做的一个重点是,这不是一个生产应用程序。我知道,否则这可能会违反用户的隐私,只是在未经用户同意的情况下进行打印,但这又不会是App Store上的公共应用程序。我发现一个应用程序似乎能够这是Printer Pro
。提示用户打印测试页面,页面打印时没有出现UIPrintInteractionController
- 这个应用程序在商店,所以我假设有一个合法的方法来做到这一点。有谁知道这是怎么做的?
据我所知,如果不调用UIPrintInteractionController
并显示系统打印对话框,则无法在iOS7中打印。
但是,iOS8现在提供了直接打印到打印而不显示对话框的规定。基本的想法是你获得一个UIPrinter
对象,并将其与- printToPrinter:completionHandler:
的新UIPrintInteractionController
方法结合使用,以便在不显示对话框的情况下进行打印。
获取打印机的UIPrinter
对象可以通过几种方式完成。
最直接的是使用新的UIPrinterPickerController
。但这会显示一个对话框,因此无法满足您的需求。
另一种方法是使用UIPrinter
方法+ printerWithURL:
通过其URL创建打印机。我不完全清楚如何获取此URL,但它可能包含在打印机的HTML管理页面中。我相信您可以使用Bonjour API以编程方式获取它。更多信息:
Bonjour是一种服务发现API,包括发现IPP打印机,这是AirPrint使用的协议。
至于Printer Pro应用程序如何在iOS7中没有对话框的情况下进行打印,我猜他们会以非常低的级别与打印机进行交互(例如原始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);
}
}];
}
}