公司的项目使用的是 Unity 2018 版本和魔改后的 XUPorter 导出的,后面需要升级到 Unity 2020 版本。但是 Unity 从 2019.3 版本后导出 Xcode 工程相比之前的版本有所修改,这里记录了升级过程中遇到的坑。
工程设置
- iOS 最低版本:Unity 2020 是
11.0
。Unity 2018 是9.0
。
编译错误,提示 PBXProject.GetUnityTargetName()
方法被废弃
- Unity 的 Xcode 工程会存在两个 target。根据选择的 target,将旧代码
1 | // Unity 2018 |
改为
1 | // Unity 2020 |
导出工程报错,提示 Exception: A required capability description is not set.
完整提示如下:
1 | WebCamTexture class is used but Camera Usage Description is empty. App will not work on iOS 10+. |
PlayerSettings
下 iOS 中的 Camera Usage Description
、Locations Usage Description
和 Microphone Usage Description
这几个选项必须有值。
修改 PlayerSettings
或者使用代码设置:
1 | PlayerSettings.iOS.cameraUsageDescription = "use camera"; // 相机使用描述,修改为相应的文案,下同 |
导出工程报错,提示 Exception: The given path BuglyMod/BuglyBridge.h does not refer to a file in a known build section
- Unity 2018 的代码只需要使用
AddFileToBuild
接口就可以添加文件,自动识别添加的是源文件、库文件或者资源文件。
1 | string fileGuid = xcodeProj.AddFile(destPath, destPath, PBXSourceTree.Source); // 将文件添加到工程中,获取文件的 GUID |
- Unity 2020 添加有些文件时需要指定 build section 才能添加成功。
1 | var fileGuid = xcodeProj.AddFile(destPath, destPath, PBXSourceTree.Source); // 将文件添加到工程中,获取文件的 GUID |
- 具体的代码在
XcodePostProcess.cs
可以看到。
添加文件时的 target 选择
- Unity 2020 生成的 Xcode 工程有两个 target,一个是
Unity-iPhone
,一个是UnityFramework
。获取方式分别为:
1 | string unityMainTargetGuid = xcodeProj.GetUnityMainTargetGuid(); // Unity-iPhone |
源文件
.h .m .mm .c .cpp
等源文件,target 选择UnityFramework
,BuildPhase 选择SourcesBuildPhase
:
1 | var fileGuid = xcodeProj.AddFile(destPath, destPath, PBXSourceTree.Source); // 将文件添加到工程中,获取文件的 GUID |
库文件
.framework
文件,target 选择UnityFramework
,可以不用指定 BuildPhase。.a
文明考吗。target 下面则UnityFramework
,BuildPhase 选择FrameworksBuildPhase
。
1 | var fileGuid = xcodeProj.AddFile(destPath, destPath, PBXSourceTree.Source); |
embed framework 文件
- target 选择
Unity-iPhone
。例如AliyunNlsSdk.framework
。
资源文件
.json .plist .bundle .config
等资源文件,target 选择Unity-iPhone
,BuildPhase 选择ResourcesBuildPhase
。
1 | var fileGuid = xcodeProj.AddFile(destPath, destPath, PBXSourceTree.Source); |
xcodebuild archive 报错,提示 error: UnityFramework does not support provisioning profiles.
修改指定参数
PRODUCT_NAME -> PRODUCT_NAME_APP
PROVISIONING_PROFILE -> PROVISIONING_PROFILE_APP
PROVISIONING_PROFILE_SPECIFIER -> PROVISIONING_PROFILE_SPECIFIER_APP
OTHER_LDFLAGS -> OTHER_LDFLAGS_FRAMEWORK
将旧的脚本
1 | 旧脚本 |
修改为
1 | 修改后的脚本 |