XUPorter是unity导出xcode工程的自动化插件,因为后期Unity官方已经将相关API集成到引擎里,作者已经不再维护。
但对于大公司项目的自动化流程,短时间内更换一套API也是不太划算的,这里只记录一下修改XUPorter以兼容Unity2019.3之后导出xcode工程的UnityFramework形式。
其实很简单,先直接上代码,后面再讲原理。
//XCProject.cs中 Line 337
public PBXDictionary AddFile( string filePath, PBXGroup parent = null, string tree = "SOURCE_ROOT", bool createBuildFiles = true, bool weak = false )
{
//.....
PBXNativeTarget mainTarget = GetNativeTarget("Unity-iPhone");//获取主工程Target
ArrayList mainDic = (ArrayList)mainTarget.data["buildPhases"];//获取主工程的包含项目
//.....
//在switch中各种资源下,加入剔除操作即可
if(mainDic.Contains(currentObject.Key))
{
Debug.Log("currentObject is: " + currentObject.Key + " " + filePath);
continue;
}
}
这样生成的xcode工程就不会把咱们自己的资源、依赖、桥接等文件加入到主工程了。
着急用的朋友可以直接拿走,没事的朋友可以听我唠叨一下。
=========================================================================
unity官方推出这种结构的意图我其实还不太明确,从CP角度来讲其实没什么变化,仅仅是把所有代码、资源、数据都放在了UnityFramework里,之前的主工程只是个入口,相当于Launcher,只做一件事就是加载UnityFramework。
对于老式的SDK接入方式也没有什么影响,毕竟是渠道方把SDK的东西都给到咱们这边对接,这些都可以用XUPorter来处理。
但对于Pod管理的SDK就需要修改下配置了,SDK的技术同学可以参考下,把Framework pod进UnityFramework里即可,也很简单:
target 'UnityFramework' do
inherit! :search_paths
pod 'XXXFramework', 'versionNum'
end
另外,有的朋友肯定会问,如果都和以前一样放到主工程行不行,我觉得行,但是会很麻烦。
首先就要处理Classes及c# Native的target。这些都是Unity导出的c#代码和相关oc类,unity每次导出都会自动修改到UnityFramework下,我们再将他们都改成主工程就很无意义。
我们就默许它们是UnityFramework里的,遵循unity的意思。
c#在Framework里,这就限制了桥接文件也必须在Framework里,而桥接文件一般也会引用第三方SDK的代码,也就形成了:C#、桥接oc、sdk都必须编译到UnityFramework的限制。
至此我的趟坑记录形成了,分享给各位遇到的朋友,欢迎大家评论转发!