macOS下PMSessionValidatePrintSettings始终返回false问题咨询
解决macOS中PMSessionValidatePrintSettings始终返回false的问题
首先要明确PMSessionValidatePrintSettings的核心逻辑:
- 接口自身返回的
OSStatus才是判断调用是否成功的依据;你代码里的result参数返回true仅表示打印设置因不兼容被系统自动修改,返回false说明你的设置完全符合当前打印机的支持能力,无需调整——这是正常状态,并非错误。
如果你的预期是设置双面打印后应该触发result=true,那可能是以下原因导致不符合预期:
可能的问题及解决方法
当前打印机不支持
kPMDuplexTumble模式:
先确认目标打印机是否支持该双面翻转模式。可以调用PMGetPrinterDuplexSupported接口查询打印机支持的双面模式列表,再选择打印机实际支持的模式进行设置。缺少错误检查导致隐性问题:
原代码未检查PMCreateSession、PMSessionSetCurrentPMPrinter等核心接口的返回值,如果这些初始化步骤失败,后续的验证操作结果会无意义。建议添加完整的错误检查:
PMPrintSettings settings; PMPrintSession session; Boolean result; OSStatus status; // 检查会话创建是否成功 status = PMCreateSession(&session); if (status != noErr) { NSLog(@"PMCreateSession failed: %d", status); return; } // 检查设置打印机是否成功 status = PMSessionSetCurrentPMPrinter(session, printer); if (status != noErr) { NSLog(@"PMSessionSetCurrentPMPrinter failed: %d", status); PMRelease(session); return; } status = PMCreatePrintSettings(&settings); if (status != noErr) { NSLog(@"PMCreatePrintSettings failed: %d", status); PMRelease(session); return; } status = PMSessionDefaultPrintSettings(session, settings); if (status != noErr) { NSLog(@"PMSessionDefaultPrintSettings failed: %d", status); PMRelease(settings); PMRelease(session); return; } // 先查询打印机支持的双面模式,再设置对应模式 PMDuplexType supportedDuplexes[10]; CFIndex count = 0; status = PMGetPrinterDuplexSupported(printer, supportedDuplexes, &count); if (status == noErr) { BOOL isTumbleSupported = NO; for (CFIndex i = 0; i < count; i++) { if (supportedDuplexes[i] == kPMDuplexTumble) { isTumbleSupported = YES; break; } } if (isTumbleSupported) { status = PMSetDuplex(settings, kPMDuplexTumble); if (status != noErr) { NSLog(@"PMSetDuplex failed: %d", status); } } else { NSLog(@"Printer does not support kPMDuplexTumble"); // 可设置打印机支持的其他双面模式,比如kPMDuplexNoTumble status = PMSetDuplex(settings, kPMDuplexNoTumble); } } // 先检查接口调用是否成功,再判断result值 status = PMSessionValidatePrintSettings(session, settings, &result); if (status != noErr) { NSLog(@"PMSessionValidatePrintSettings failed: %d", status); } else { if (result) { NSLog(@"Print settings were modified to match printer capabilities"); } else { NSLog(@"Print settings are already compatible with printer"); } } PMRelease(session); PMRelease(settings);
- 误解返回值的含义:
不要把result=false当成验证失败。如果你的需求是确保打印设置有效,应该检查PMSessionValidatePrintSettings本身的返回值(OSStatus)是否为noErr,而非result参数。
内容的提问来源于stack exchange,提问作者pol9595
相关产品推荐
相关产品推荐

