返回

Unity iOS打包闪退之AdServices.framework库加载失败深度排查

Android

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工程

  1. 打开XCode工程,找到目标项目的Build Settings。
  2. 在"Required"一栏中,找到AdServices.framework,并将其改为"Optional"。
  3. 重新编译项目并运行,问题解决。

方式二:Unity打包后处理

  1. 打开Unity打包设置,找到"iOS Player"选项卡。
  2. 在"Other Settings"部分,找到"Post-process the player"选项,并将其改为"true"。
  3. 在"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
  1. 重新编译项目并打包,问题解决。

经验总结

通过这次故障排查,我们总结出以下经验:

  • 在集成第三方库时,务必要注意库的兼容性,确保库的版本与项目所支持的iOS版本相匹配。
  • 在XCode工程中添加库时,应根据库的性质将其标记为必需的或可选的,以免导致运行时错误。
  • 在Unity打包时,可以利用后处理脚本对打包后的ipa进行修改,以解决一些打包过程中无法解决的问题。

写在最后

希望这篇博文能帮助大家解决Unity iOS真机闪退的问题。如果您有任何问题或建议,欢迎在评论区留言,谢谢阅读!

常见问题解答

  1. 为什么我无法在XCode工程中找到AdServices.framework?

    答:这是因为AdServices.framework是通过CocoaPods集成的,它不会出现在XCode工程中。您需要使用命令行工具手动添加它。

  2. 为什么CocoaPods会默认将AdServices.framework标记为必需的库?

    答:CocoaPods是为了确保您的项目具有运行所需的所有依赖项。由于AdServices.framework对于iOS 14.3及更高版本的设备是必需的,因此CocoaPods会自动将其标记为必需的库。

  3. 我可以通过代码来修改AdServices.framework的Required属性吗?

    答:可以,但这是一个相对复杂的过程。建议使用上面提供的后处理脚本,因为它更加简单可靠。

  4. 修改AdServices.framework的Required属性后,是否会对我的项目产生负面影响?

    答:不会,将AdServices.framework的Required属性改为Optional只是告诉iOS运行时这个库是可选的,不会对您的项目产生任何负面影响。

  5. 除了AdServices.framework之外,还有哪些第三方库可能会导致Unity iOS真机闪退?

    答:其他可能导致Unity iOS真机闪退的第三方库包括:

    • Facebook SDK
    • Google Mobile Ads SDK
    • Firebase SDK
    • Crashlytics SDK

    确保您正在使用与您的项目所支持的iOS版本兼容的最新版本的这些库。