自定义PDF Viewer未运行时,文档类型关联触发崩溃问题排查
解决PDF Viewer关联崩溃与图标显示问题
一、修复未运行时打开PDF崩溃的问题
从你的崩溃日志和info.plist配置来看,有两个核心问题需要修正:
1. 修正info.plist中的文档类型配置
你的CFBundleDocumentTypes里存在错误的UTI和包类型设置:
LSItemContentTypes应该使用PDF标准UTIcom.adobe.pdf,而不是自定义的giannigianino.Mirror,系统需要正确识别文件类型才能传递正确的打开事件LSTypeIsPackage设为1是错误的,PDF是单个文件不是包,应该改为0或者直接移除这个键
修正后的CFBundleDocumentTypes配置应该是这样:
<key>CFBundleDocumentTypes</key> <array> <dict> <key>CFBundleTypeExtensions</key> <array> <string>pdf</string> </array> <key>CFBundleTypeIconFile</key> <string>pdfformat</string> <key>CFBundleTypeName</key> <string>PDF Document</string> <key>CFBundleTypeRole</key> <string>Viewer</string> <key>LSHandlerRank</key> <string>Default</string> <key>LSItemContentTypes</key> <array> <string>com.adobe.pdf</string> </array> <key>LSTypeIsPackage</key> <integer>0</integer> </dict> </array>
2. 完善application:openFile:方法的初始化逻辑
崩溃发生在AppDelegate的application(_:openFile:)方法中,原因是应用未运行时,窗口、PDF视图等核心组件还没初始化完成就尝试加载文件。你需要确保在处理打开文件事件前,先完成必要的界面初始化:
比如在Swift中,你可以这样修改方法:
func application(_ sender: NSApplication, openFile filename: String) -> Bool { // 先确保主窗口已初始化 if let window = NSApplication.shared.mainWindow { // 假设你有一个PDFViewController来显示文档 if let pdfVC = window.contentViewController as? PDFViewController { pdfVC.loadPDF(atPath: filename) return true } } else { // 如果主窗口还没创建,先初始化窗口和视图控制器 let window = NSWindow(contentRect: NSRect(x: 0, y: 0, width: 800, height: 600), styleMask: [.titled, .closable, .resizable, .miniaturizable], backing: .buffered, defer: false) let pdfVC = PDFViewController() window.contentViewController = pdfVC window.makeKeyAndOrderFront(nil) pdfVC.loadPDF(atPath: filename) NSApplication.shared.mainWindow = window return true } return false }
关键是要保证在加载PDF文件前,所有显示文档所需的UI组件都已完成初始化,避免空指针或未就绪的组件导致崩溃。
二、修复PDF文件图标不显示的问题
图标无法显示的原因通常和以下几点有关:
- 确保你的
pdfformat.icns文件已经正确添加到Xcode项目中,并且在Build Phases的Copy Bundle Resources列表里 - 确认图标文件是标准的.icns格式(包含不同尺寸的图标资源),而不是普通的图片文件
- 修正上面提到的
info.plist中的UTI配置,只有系统正确识别了你的应用是PDF的默认打开程序,才会显示自定义图标 - 可以尝试重置Launch Services缓存,在Terminal中执行以下命令:
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -kill -r -domain local -domain system -domain user
执行后重启Mac,图标应该会正常显示。
内容的提问来源于stack exchange,提问作者Gianni
相关产品推荐
相关产品推荐

