Unity iOS打包闪退之AdServices.framework库加载失败深度排查
2023-11-04 07:10:36
Unity iOS真机闪退问题:dlopen()失败,找不到符号
故障缘由
Unity iOS项目在真机调试时突然闪退,控制台报错:
Error loading ***.app/Frameworks/UnityFramework.framework/UnityFramework: dlopen() failed: Symbol not found: _OBJC_CLASS_$_ADBannerView (_OBJC_CLASS_$_ADBannerView not found)
乍一看,这是UnityFramework库加载失败导致的,但深入分析后,发现罪魁祸首竟然是AdServices.framework库!
成因剖析
在iOS SDK中,AdServices.framework是一个可选的库,仅支持14.3及以上版本的iOS。在我们的项目中,AdServices.framework是通过CocoaPods集成的,但我们并没有显式地在XCode工程中添加它。
默认情况下,CocoaPods会将AdServices.framework标记为必需的库,导致低版本iOS在运行时无法找到这个库,从而引发闪退。
解决方案
针对这个问题,我们有两种解决方案:
方式一:直接修改XCode工程
- 打开XCode工程,找到目标项目的Build Settings。
- 在"Required"一栏中,找到AdServices.framework,并将其改为"Optional"。
- 重新编译项目并运行,问题解决。
方式二:Unity打包后处理
- 打开Unity打包设置,找到"iOS Player"选项卡。
- 在"Other Settings"部分,找到"Post-process the player"选项,并将其改为"true"。
- 在"Post-process script"字段中,输入以下脚本:
#!/bin/bash
# 修改AdServices.framework的Required属性为Optional
framework_path="$1/Frameworks/AdServices.framework"
if [[ -d "$framework_path" ]]; then
defaults write "$framework_path/Info.plist" RequiredPlatformVersion 0.0
fi
- 重新编译项目并打包,问题解决。
经验总结
通过这次故障排查,我们总结出以下经验:
- 在集成第三方库时,务必要注意库的兼容性,确保库的版本与项目所支持的iOS版本相匹配。
- 在XCode工程中添加库时,应根据库的性质将其标记为必需的或可选的,以免导致运行时错误。
- 在Unity打包时,可以利用后处理脚本对打包后的ipa进行修改,以解决一些打包过程中无法解决的问题。
写在最后
希望这篇博文能帮助大家解决Unity iOS真机闪退的问题。如果您有任何问题或建议,欢迎在评论区留言,谢谢阅读!
常见问题解答
-
为什么我无法在XCode工程中找到AdServices.framework?
答:这是因为AdServices.framework是通过CocoaPods集成的,它不会出现在XCode工程中。您需要使用命令行工具手动添加它。
-
为什么CocoaPods会默认将AdServices.framework标记为必需的库?
答:CocoaPods是为了确保您的项目具有运行所需的所有依赖项。由于AdServices.framework对于iOS 14.3及更高版本的设备是必需的,因此CocoaPods会自动将其标记为必需的库。
-
我可以通过代码来修改AdServices.framework的Required属性吗?
答:可以,但这是一个相对复杂的过程。建议使用上面提供的后处理脚本,因为它更加简单可靠。
-
修改AdServices.framework的Required属性后,是否会对我的项目产生负面影响?
答:不会,将AdServices.framework的Required属性改为Optional只是告诉iOS运行时这个库是可选的,不会对您的项目产生任何负面影响。
-
除了AdServices.framework之外,还有哪些第三方库可能会导致Unity iOS真机闪退?
答:其他可能导致Unity iOS真机闪退的第三方库包括:
- Facebook SDK
- Google Mobile Ads SDK
- Firebase SDK
- Crashlytics SDK
确保您正在使用与您的项目所支持的iOS版本兼容的最新版本的这些库。