You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS15下UIPrintInteractionController的printToPrinter接口崩溃求助

iOS 15下UIPrintInteractionController崩溃问题:-[PKPrinter _internalPrinter]: unrecognized selector sent to instance

问题背景

在iOS 15环境中,调用UIPrintInteractionController的默认打印流程时触发崩溃,崩溃触发于lookupLastUsedPrinter API调用,报错为-[PKPrinter _internalPrinter]: unrecognized selector sent to instance。

崩溃调用栈

uncaught ObjC exception, reason: -[PKPrinter _internalPrinter]: unrecognized selector sent to instance 

Last Exception Backtrace:
2   libobjc.A.dylib                      objc_exception_throw (??:0) + 60 
3   CoreFoundation                       __CFOAInitializeNSObject (??:0) + 1535940 
4   CoreFoundation                       ___forwarding___ (??:0) + 188056 
5   CoreFoundation                       __CFRunLoopDoTimers (??:0) + 96 
6   UIKitCore                            __51-[UIPrintPanelViewController lookupLastUsedPrinter]_block_invoke (??:0) + 15751960 
7   UIKitCore                            -[UIPrintPanelViewController loadView] (??:0) + 15735732 
8   UIKitCore                            __88-[UIPrintInteractionController _generatePDFInRange:useFullRange:withQuality:completion:]_block_invoke (??:0) + 15935408 
9   UIKitCore                            -[UIPrintInteractionController printToPrinter:completionHandler:] (??:0) + 15915992 
10  UIKitCore                            -[UIPrintInteractionController _completePrintPageWithError:] (??:0) + 15960488 
11  UIKitCore                            -[UIPrintInteractionController printToPrinter:completionHandler:] (??:0) + 15915780 

触发崩溃的代码

UIPrintInteractionController *printController = [UIPrintInteractionController sharedPrintController];
UIPrintInteractionCompletionHandler completionHandler = ^(UIPrintInteractionController *printControllerT, BOOL completed, NSError *error) {
  [printControllerT setDelegate:nil];                          
};
[printController setDelegate:printDelegate];
[printController setPrintingItem:rurlPrintJob];                    
[printController presentAnimated:YES completionHandler:completionHandler];

可行解决思路

已知相关讨论中提到的printer.contactPrinter方案不适用于当前默认打印流程,可尝试以下几种方案:

1. 重置打印缓存

崩溃源于系统尝试访问旧PKPrinter实例的私有方法,iOS 15中该方法已被修改。可通过清除打印相关的用户默认配置重置缓存:

// 清除打印相关的用户默认配置
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:@"com.apple.print"];
[[NSUserDefaults standardUserDefaults] synchronize];

建议在App启动时或打印前执行该操作,避免系统加载无效的旧打印机数据。

2. 避免复用单例实例

每次打印时创建新的UIPrintInteractionController实例,替代单例复用,防止单例缓存旧打印机状态:

// 创建新实例而非使用单例
UIPrintInteractionController *printController = [[UIPrintInteractionController alloc] init];
UIPrintInteractionCompletionHandler completionHandler = ^(UIPrintInteractionController *printControllerT, BOOL completed, NSError *error) {
  [printControllerT setDelegate:nil];                          
};
[printController setDelegate:printDelegate];
[printController setPrintingItem:rurlPrintJob];                    
[printController presentAnimated:YES completionHandler:completionHandler];

3. 跳过自动查找最后使用的打印机

实现UIPrintInteractionControllerDelegate的printInteractionController:choosePrinter:方法,强制用户选择打印机,绕过系统自动查找逻辑:

- (void)printInteractionController:(UIPrintInteractionController *)printInteractionController choosePrinter:(void (^)(UIPrinter * _Nullable))completionHandler {
    // 传入nil触发系统打印机选择界面,跳过自动查找流程
    completionHandler(nil);
}

4. 临时兼容私有方法(谨慎使用)

若上述方案无效,可通过分类为PKPrinter添加_internalPrinter方法避免崩溃(注意:使用私有API可能导致审核不通过,仅作临时应急):

@interface PKPrinter (iOS15Fix)
- (id)_internalPrinter;
@end

@implementation PKPrinter (iOS15Fix)
- (id)_internalPrinter {
    return self;
}
@end

内容的提问来源于stack exchange,提问作者Sindhusha Yadavalli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 04:54:15