You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:09:03