Firebase Crashlytics for macOS:已配置NSApplicationCrashOnExceptions仍触发警告
你在macOS AppKit应用中集成Firebase Crashlytics时,已按官方要求在Info.plist添加NSApplicationCrashOnExceptions键,但仍收到警告,通过UserDefaults注册该值后警告消失。针对你的四个疑问,解答如下:
1. 既然崩溃已正常上报,是否应移除UserDefaults代码并忽略警告?
不建议忽略警告或移除代码。虽然测试崩溃能正常上报,但NSApplicationCrashOnExceptions的核心作用是让应用在遇到未捕获顶级异常时直接崩溃——macOS默认会尝试恢复应用而非立即终止。如果该配置未生效,部分未捕获异常可能不会被Crashlytics收集到完整的调用栈信息,或者异常发生后应用处于不稳定状态,导致后续崩溃的上报不完整。即使当前测试正常,也需要确保该配置真正生效,避免潜在的上报缺失问题。
2. 是否应保留运行时设置以抑制警告?
可以保留,但优先排查Info.plist的配置问题:
- 确认
Info.plist是当前应用target的主配置文件,而非其他target的; - 检查键名拼写完全正确(大小写、空格都不能错);
- 清理Xcode缓存(
Cmd+Shift+K)后重新构建,避免缓存导致配置未被打包。
如果排查后Info.plist配置无误但警告仍存在,保留UserDefaults的代码是可行的——该方法只是注册默认值,不会覆盖用户偏好,且能确保Crashlytics初始化前检测到该配置,同时抑制警告。建议将代码移到AppDelegate的init方法中,比applicationDidFinishLaunching更早执行:
@main class AppDelegate: NSObject, NSApplicationDelegate { override init() { super.init() UserDefaults.standard.register(defaults: ["NSApplicationCrashOnExceptions": true]) } func applicationDidFinishLaunching(_ aNotification: Notification) { FirebaseApp.configure() // 其他初始化代码 } }
3. 是否是Firebase SDK未正确读取Info.plist的Bug?
有可能,但也可能是配置或系统同步问题:
Info.plist中的键会自动同步到UserDefaults,但如果应用启动时某些流程干扰了这个同步,就会导致Crashlytics检测不到;- 部分Firebase SDK版本存在检测逻辑的小问题,你可以查看Firebase的官方issue追踪是否有相关报告;
- 如果确认
Info.plist配置正确且同步正常,但警告仍出现,那大概率是SDK的检测逻辑bug,可以提交反馈。
4. 是否有其他开发者遇到过此问题?
是的,不少macOS开发者在集成Firebase Crashlytics时遇到过相同问题。常见诱因包括:Xcode缓存导致Info.plist未正确打包、SDK版本兼容性、macOS系统对UserDefaults同步的延迟等,很多人通过UserDefaults注册默认值的方式解决了警告问题。
内容的提问来源于stack exchange,提问作者user10711707

