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