您的位置:首页 > 其它

XUPorter使用说明

2019-02-27 21:14 429 查看

概述

在打包IOS的过程中,针对需要接入的不同SDK,包括源码、需要的库和框架等,若不使用一些辅助工具的话,需要在导出的IOS工程中手动进行,针对不同SDK的依赖库的添加等操作,路径设置等操作,会消耗大量的时间,于是需要一套自动化添加IOS端SDK相关配置的方案

Unity的支持

Unity中加入了[PostProcessBuild]标签,通过该标签标注的函数,在build player结束后会自动调用,于是便提供了一个添加或修改IOS工程配置的一个入口

XUPorter

使用方法

  1. 从对应Github项目中copy所有文件
  2. 放入Unity中的Editor目录下
  3. 确定一个存放projmods文件的目录
  4. 添加相关的SDK依赖文件,并添加对应的projmods配置文件

projmods文件配置说明

  • group:所有由该projmods添加的文件和文件夹所属的Xcode中的group名称
  • libs:在Xcode Build Phases中需要添加的动态链接库的名称,比如libz.dylib
  • frameworks:在Xcode Build Phases中需要添加的框架的名称,比如Security.framework
  • headerpaths:Xcode中编译设置中的Header Search Paths路径
  • files:加入工程的文件名
  • folders:加入工程的文件夹,其中所有的文件和文件夹都将被加入工程中
  • linker_flags:添加到工程linker flag中的链接配置,比如-ObjC
  • excludes:忽略的文件的正则表达式,匹配的文件将不会被加入工程中
    备注:其中所有定义的路径都是基于当前projmods文件位置的相对路径

GT测试工具的接入

根据GT测试工具的官方文档,需要我们添加所需引用的系统framework如下:

  • libz.dylib
  • libsqlite3.dylib
  • Security.framework
  • CoreTelephony.framework
  • AdSupport.framework
  • AudioToolbox.framework
  • SystemConfiguration.framework
  • QuartzCore.framework
  • CoreGraphics.framework
  • UIKit.framework
文件目录如下

对应projmods文件内容如下
{
"group": "GT",
"libs": [
"libz.tbd",
"libsqlite3.tbd"
],
"frameworks": [
"Security.framework",
"CoreTelephony.framework",
"AdSupport.framework",
"AudioToolbox.framework",
"SystemConfiguration.framework",
"QuartzCore.framework",
"CoreGraphics.framework",
"UIKit.framework"
],
"headerpaths": [],
"files":   [
"GT/GT.framework",
"GT/Resources/GT.bundle"
],
"folders": [],
"excludes": ["^.*.meta$", "^.*.mdown$", "^.*.pdf$"],
"compiler_flags": [],
"linker_flags": [
"-ObjC"
]

}

可发现"frameworks"标签中我们添加了GT测试工具框架所需的系统支持框架名称,而libz.tbd等动态链接库则写在"libs"标签后,需要引入的文件,GT.framework和GT.bundle则写在"files"标签后,用于后续加入项目中

XCode工程设置情况

完成IOS工程导出后,将对应工程导入XCode中可发现,projmods文件中的配置内容均生效

方案实现逻辑

  1. XCodePostProcess类中会有标记了[PostProcessBuild]便签的接口
#if UNITY_EDITOR
[PostProcessBuild(999)]
public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProject)
  1. 该接口中读取XCode工程文件
  2. 找到指定目录下的*.projmods文件,并根据文件内容向工程中添加文件或依赖库
var modsPath = Path.GetFullPath(Path.Combine(Application.dataPath, "../XCode/XUPorterMods"));
Debug.Log("modsPath: " + modsPath);
string[] files = Directory.GetFiles(modsPath, "*.projmods", SearchOption.TopDirectoryOnly);
foreach (string file in files)
{
Debug.Log("ProjMod File: " + file);
project.ApplyMod(file);
}
// 若是Profiling版本则需要把Profiling目录下的*.projmods文件也应用上
if (Game.OneKeyBuild.lastEnv == AppEnv.Profiling)
{
var profilingPath = Path.Combine(modsPath, "Profiling");
string[] profilingFiles = Directory.GetFiles(profilingPath, "*.projmods", SearchOption.TopDirectoryOnly);
foreach (string file in profilingFiles)
{
Debug.Log("Profiling ProjMod File: " + file);
project.ApplyMod(file);
}
}
  1. 针对不同SDK若有修改IOS项目代码的需求可以通过XClass类进行代码编辑,例如此处需要在游戏启动之后添加GT测试工具的启动代码
//编辑代码文件
EditorCode(path);
/// <summary>
/// 编辑代码
/// </summary>
/// <param name="filePath"></param>
private static void EditorCode(string filePath)
{
if (Game.OneKeyBuild.lastEnv == AppEnv.Profiling)
{
//读取UnityAppController.mm文件
XClass UnityAppController = new XClass(filePath + "/Classes/UnityAppController.mm");
//在指定代码后面增加一行代码
UnityAppController.WriteBelow("#include \"PluginBase/AppDelegateListener.h\"", "extern \"C\" \n { \n #include <GT/GT.h> \n }");
//在指定代码后面增加一行
UnityAppController.WriteBelow("// send notfications", "GT_DEBUG_INIT;");
}
}
  1. 最后编辑完毕后保存项目类
// Finally save the xcode project
project.Save();

采坑点

  1. 如果文件目录改动之后,需要将project.pbxproj文件删除重新生成,否则还会按照上次的路径进行XCode工程的配置

参考:
https://onevcat.com/2012/12/xuporter/

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: