6

在我的 iOS 应用程序中,我有以下代码用于 AirPrinting 一个简单的 NSString。

#pragma mark - Print
-(IBAction)print:(id)sender {

    UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];
    pic.delegate = self;

    UIPrintInfo *printInfo = [UIPrintInfo printInfo];
    printInfo.outputType = UIPrintInfoOutputGeneral;
    printInfo.jobName = @"Message";
    pic.printInfo = printInfo;

    UISimpleTextPrintFormatter *textFormatter = [[UISimpleTextPrintFormatter alloc]initWithText:self.Message.text];
    textFormatter.startPage = 0;
    textFormatter.contentInsets = UIEdgeInsetsMake(72.0, 72.0, 72.0, 72.0); // 1 inch margins
    textFormatter.maximumContentWidth = 6 * 72.0;
    pic.printFormatter = textFormatter;
    pic.showsPageRange = YES;

    void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =
    ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
        if (!completed && error) {
            NSLog(@"Printing could not complete because of error: %@", error);
        }
    };
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        [pic presentFromBarButtonItem:sender animated:YES completionHandler:completionHandler];
    } else {
        [pic presentAnimated:YES completionHandler:completionHandler];
    }
}

当我运行我的项目(测试它)时,这是我在 UIPrintInteractionController 上点击“打印”时在输出调试器窗口中遇到的错误:

Simulated\032InkJet\032@\032USER\032NAME\032iMac._ipp._tcp.local.: startJob: Unable to connect to printd: Connection refused

我在使用打印模拟器的 iOS 5.1 模拟器中收到此错误。为什么我会收到此错误?我感觉这与我使用打印模拟器的方式有关。

感谢您提供任何帮助,并且作为旁注,有人知道如何从 iPad 上的普通 UIButton 而不是 BarButtonItem 显示 UIPrintInteraction 控制器吗?

编辑:应该注意的是,在 iOS 6.0+ 中使用 Share Sheets 时会自动设置 AirPrint。

4

3 回答 3

11

我遇到了完全相同的问题,基本上肉馅的答案解决了这个问题。但是,我确实必须先跳几圈。最终这是某种文件权限问题。

我做了以下事情(注意,需要管理员访问权限):

  1. 打开终端并导航到文件夹 /private/var/tmp/

  2. 键入“whoami”以查看您的确切用户名。

  3. 假设您的用户名是“dogtest”。输入“sudo chown dogtest:admin printd”。你会得到一个警告,基本上要求你确保你知道你在做什么。

  4. 输入您的管理员密码,然后按 Enter。

  5. 现在您拥有了 printd 文件的所有权,并且可以用它做您想做的事。通过键入“mv printd printd-ren”将文件重命名为其他名称。

  6. 打开 iOS 模拟器和打印机模拟器。

  7. 在 iOS 模拟器中打开 Safari 并转到任何网页。

  8. 点击底部中心的共享按钮,然后选择打印。

  9. 按照提示完成打印。您应该在打印机模拟器日志窗口中看到更多活动。此时使用您的帐户权限重新创建 printd 文件(这很好)。

  10. 退出 iOS 模拟器和打印机模拟器。

  11. 在模拟器中重新运行您的 iOS 应用程序,然后重新打开打印机模拟器。

  12. 现在您应该能够从您的应用程序模拟 Air Print,并且打印输出将在预览中以 PDF 格式打开。

我希望这可以为您解决问题,或者至少为您指明正确的方向。祝你好运。

于 2012-08-04T02:39:52.827 回答
3

尝试删除

/private/var/tmp/printd

于 2012-04-15T16:32:06.660 回答
2

我让打印机模拟器停止为我工作,根本没有给我任何错误。我尝试了不同的模拟器,重置它们,重新启动计算机,如上所述杀死 printd 等等。

最后,为我解决的问题是改变了我的网络连接:当时,我的 macbook 上连接了 wifi 和以太网电缆(通过 Thunderbolt)——wifi + 以太网都连接到同一个网络。我拔出以太网电缆,它立即又开始工作了。

谢谢苹果,我在哪里可以找回我的 20 分钟 :)

于 2015-06-14T22:03:57.410 回答