iOS真机集成OneSignal框架崩溃:找不到OneSignalInAppMessages库
问题背景
开发自定义框架时通过Swift Package Manager集成OneSignal v5.0.4封装推送功能,iOS 17.0.1模拟器运行正常且能接收通知,但在iPad Air 5(iPadOS 17.0.3)、iPhone 14(iOS 17.1.1)等真机上启动崩溃,核心报错:
dyld: Library not loaded: @rpath/OneSignalInAppMessages.framework/OneSignalInAppMessages
Referenced from: /private/var/containers/Bundle/Application/XXX/YourApp.app/Frameworks/YourCustomFramework.framework/YourCustomFramework
Reason: tried: '/usr/lib/swift/OneSignalInAppMessages.framework/OneSignalInAppMessages' (no such file), '/private/preboot/Cryptexes/OS/usr/lib/swift/OneSignalInAppMessages.framework/OneSignalInAppMessages' (no such file), '@rpath/OneSignalInAppMessages.framework/OneSignalInAppMessages' (no such file)...
已尝试的无效操作:切换Xcode 14/15版本、手动配置@rpath、设置ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES、将OneSignal添加到框架依赖列表。
可行修复方案
1. 确保主应用正确嵌入OneSignal子框架
自定义框架的依赖不会自动传递嵌入配置到主应用,需手动检查主应用的框架嵌入设置:
- 打开主应用Xcode项目,进入Target > General > Frameworks, Libraries, and Embedded Content
- 找到OneSignal系列框架(包括OneSignalInAppMessages.framework),将它们的Embed选项统一设为
Embed & Sign - 若主应用未直接添加OneSignal依赖,需在主应用的
Package.swift或Xcode的SPM依赖列表中显式引入OneSignal v5.0.4
2. 修正自定义框架的Build Settings路径配置
- 进入自定义框架的Target > Build Settings > Framework Search Paths,添加
$(PROJECT_DIR)/Packages/OneSignal-5.0.4/OneSignalInAppMessages(根据你的SPM包实际路径调整),并设置为recursive - 确认
Runpath Search Paths包含@executable_path/Frameworks和@loader_path/Frameworks两个路径
3. 显式声明OneSignal子产品依赖
在自定义框架的Package.swift中,直接声明需要的OneSignal子产品,避免SPM自动依赖遗漏:
dependencies: [ .package(url: "https://github.com/OneSignal/OneSignal-iOS-SDK.git", exact: "5.0.4") ], targets: [ .target( name: "YourCustomFramework", dependencies: [ .product(name: "OneSignal", package: "OneSignal-iOS-SDK"), .product(name: "OneSignalInAppMessages", package: "OneSignal-iOS-SDK") ] ) ]
4. 彻底清理缓存后重构
- 执行
Cmd + Shift + K清理项目缓存 - 终端执行
rm -rf ~/Library/Developer/Xcode/DerivedData清除全局DerivedData - 重新构建自定义框架,再集成到主应用中测试
5. 验证依赖路径一致性
用otool命令检查自定义框架的依赖引用路径是否正确:
otool -L YourCustomFramework.framework/YourCustomFramework
确认输出中OneSignalInAppMessages.framework的引用路径为@rpath/OneSignalInAppMessages.framework/OneSignalInAppMessages,同时检查主应用的Frameworks目录下是否存在该框架。
内容的提问来源于stack exchange,提问作者Karim Sakr

