我正在研究客户的潜在应用,我有一个问题,我无法找到答案。我想做的就是自动打印,而无需显示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);
}
}];
}
}