Objective c AirPrint:在UIPrintInteractionController中设置默认打印机

Objective c AirPrint:在UIPrintInteractionController中设置默认打印机,objective-c,ios,printing,airplay,Objective C,Ios,Printing,Airplay,我需要一种方法,在显示UIPrintInteractionController时,使用已知的printerId将所选打印机强制添加到UIPrintInteractionController 注意:为了进行测试,我使用的是安装在“MacBook Pro”上的Printopia,它与“打印机”共享 我做了这个测试: -(IBAction)print:(id)sender { UIPrintInteractionController *controller = [UIPrintInteraction

我需要一种方法,在显示UIPrintInteractionController时,使用已知的printerId将所选打印机强制添加到UIPrintInteractionController

注意:为了进行测试,我使用的是安装在“MacBook Pro”上的Printopia,它与“打印机”共享

我做了这个测试:

-(IBAction)print:(id)sender
{
 UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];

 UIPrintInteractionCompletionHandler completionHandler = ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
      NSLog(@"Selected Printer ID: %@",printController.printInfo.printerID);      
  };

 NSString* path = [[NSBundle mainBundle] pathForResource:@"TestImage" ofType:@"png"];
 NSURL* imageURL = [NSURL fileURLWithPath:path isDirectory:NO];

 UIPrintInfo *printInfo = [UIPrintInfo printInfo];
 printInfo.outputType = UIPrintInfoOutputPhoto;
 printInfo.jobName = @"Image print";
 controller.printInfo = printInfo;

 controller.printingItem = imageURL;

 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
 {
    [controller presentFromBarButtonItem:self.printButton animated:YES completionHandler:completionHandler];  // iPad
 }
 else
 {
     [controller presentAnimated:YES completionHandler:completionHandler];  // iPhone
 }
}
打印完成后,应用程序将记录以下打印机ID:

\032Printer\032@\032MacBook\032Pro._ipp._tcp.local.
我想覆盖打印机,所以我应该这样做:

UIPrintInfo *printInfo = [UIPrintInfo printInfo];
printInfo.printerId = @"\032Printer\032@\032MacBook\032Pro._ipp._tcp.local.";
controller.printInfo = printInfo;
但由于某些原因,它无法工作,UIPrintInteractionController没有按预期选择打印机,但打印机会显示在打印机列表中

我想问题在于打印机ID中存在奇怪的字符

有人知道printInfo.printerId是如何编码的,以及如何手动设置它吗

如果我将NSString*printerId存储到ivar中,并在下一个打印操作中再次设置它,它将正常工作,但我无法手动按打印机Id强制默认打印机



顺便说一句:显然,如果打印机不可用/无法访问,我知道无法选择…

为了以编程方式设置默认打印机,您只需将printInfo的printerID设置为.\u ipp.\u tcp.local。printerName应与UIPrinterInteractionController popover中打印机列表中的显示方式完全相同。例如,对于显示为LANIERCOLOR315[00:80:A3:95:2D:41]的打印机,打印机ID为
LANIERCOLOR315[00:80:A3:95:2D:41]。\u ipp.\u tcp.local
。您不必对特殊字符进行编码。框架可以做到这一点。

谢谢,它适用于标准的AirPrint打印机。问题在于Printopia附加了一个用作打印机图标的特殊字符。幸运的是,可以在Printopia设置中禁用它。