Unity2018.4.x导出iOS项目缺失UnityFramework Target无法生成xcframework
Unity 2018.4.x默认不会生成独立的UnityFramework target,所有Unity runtime代码都会打包到主app的.app产物中,你在高版本Unity做的POC项目的默认逻辑不适用于2018版本,按以下步骤操作即可:
解决方案
第一步:Unity项目端配置校验
- 打开Build Settings > iOS平台,点击
Player Settings - 找到
Other Settings>Configuration部分,确认渲染后端适配ARKit、VR组件的同时,将Build Target SDK设置为Device SDK(模拟器SDK不会生成可用的framework) - 确认Scripting Define Symbols中已经添加你用到的ARKit、VR相关标记,比如
ARKIT_ENABLED、UNITY_VR_SUPPORT等 - 回到Build Settings窗口的iOS平台配置区,取消勾选
Symlink Unity libraries,确认勾选Create Xcode Project
第二步:添加Xcode导出后处理脚本
在你的Unity项目Assets/Editor目录下新建C#脚本,命名为iOSFrameworkBuildPostProcessor.cs,填入以下内容:
using UnityEditor; using UnityEditor.iOS.Xcode; using UnityEngine; using System.IO; public class iOSFrameworkBuildPostProcessor : IPostprocessBuildWithReport { public int callbackOrder => 999; public void OnPostprocessBuild(BuildReport report) { if (report.summary.platform != BuildTarget.iOS) return; string projPath = PBXProject.GetPBXProjectPath(report.summary.outputPath); PBXProject proj = new PBXProject(); proj.ReadFromString(File.ReadAllText(projPath)); // 获取默认主target的GUID string mainTargetGuid = proj.TargetGuidByName("Unity-iPhone"); // 新增UnityFramework动态库target string frameworkTargetGuid = proj.AddTarget("UnityFramework", PBXProject.TargetType.Framework, "com.unity.unityframework", "ios"); // 复制主target的全部编译配置 proj.CopyBuildSettings(mainTargetGuid, frameworkTargetGuid); // 配置framework属性 proj.SetBuildProperty(frameworkTargetGuid, "PRODUCT_NAME", "UnityFramework"); proj.SetBuildProperty(frameworkTargetGuid, "MACH_O_TYPE", "mh_dylib"); proj.SetBuildProperty(frameworkTargetGuid, "DEAD_CODE_STRIPPING", "NO"); // 添加ARKit、VR依赖的系统框架 proj.AddFrameworkToProject(frameworkTargetGuid, "ARKit.framework", false); proj.AddFrameworkToProject(frameworkTargetGuid, "CoreMotion.framework", false); // 其他用到的系统框架可按上述格式自行添加 // 把主target的全部源文件、资源同步到framework target foreach (string fileGuid in proj.GetAllSourceFileGuids()) { proj.AddFileToBuild(frameworkTargetGuid, fileGuid); } foreach (string resGuid in proj.GetAllResourceFileGuids()) { proj.AddResourceFileToBuild(frameworkTargetGuid, resGuid); } File.WriteAllText(projPath, proj.WriteToString()); } }
- 保存脚本后重新执行Unity Build操作,不要点击Build&Run,直接点击Build导出Xcode工程
第三步:Xcode工程配置校验
- 打开导出的
.xcworkspace文件,确认左侧target列表中已经出现UnityFramework - 选中UnityFramework target,在
General>Deployment Info中确认iOS版本和主Unity-iPhone target完全一致 - 在
Build Settings>Search Paths中确认Framework Search Paths、Header Search Paths和主target保持一致 - 如果用到CocoaPods依赖,在Podfile中添加
use_frameworks!后重新执行pod install,确保Pods依赖对UnityFramework target生效 - 分别选择真机和模拟器架构编译UnityFramework target,确认Products目录下生成对应架构的
UnityFramework.framework
第四步:生成xcframework
分别完成真机和模拟器架构的framework编译后,在终端执行以下命令生成xcframework:
xcodebuild -create-xcframework \ -framework 真机framework路径/UnityFramework.framework \ -framework 模拟器framework路径/UnityFramework.framework \ -output 输出路径/UnityFramework.xcframework
常见问题排查
- 如果framework运行时报符号缺失:回到Unity Player Settings > Other Settings,将
Strip Engine Code设置为Disabled,2018版本的代码剥离功能经常会误删ARKit、VR依赖的底层符号 - 如果编译时报duplicate symbol错误:检查UnityFramework target > Build Phases > Compile Sources,删除重复的源文件即可
- 如果framework启动闪退:确认UnityFramework target的Build Settings >
Other Linker Flags和主target保持一致,包含所有依赖的链接参数
内容的提问来源于stack exchange,提问作者iOS_learner
相关产品推荐
相关产品推荐

