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
相关产品推荐
相关产品推荐

