写在前面
这个是很久就想去看看的知识点,之前一直觉得很繁琐,可能会很麻烦,今天花了点时间研究了一下。
基础
为什么需要配置?
我们知道我们打苹果包的流程是:先由unity工程导出xcode工程,然后使用xcode打成苹果包。这里导出的xcode工程其中有些xcode配置unity是帮我们配置好了的,比如版本号,产品名等。但是我们自定义导入的第三方SDK,需要的一些权限或者是库,这里unity是不会帮我们配置的。这样就需要我们手动配置一下。
自动配置
基本原理:我们都知道xcode工程会有proj文件和info.plist文件。就和我们使用unity写代码是会生成csproj文件一样。这些文件就是工程的一些配置,我们只需要更改这些文件既可以,最直接方式就是我们用文本的方式读取该文件,然后修改读出来的内容即可。unity这里帮我们把这些文件序列化好了。我们直接使用api即可。官方api,
怎么用
实际很简单,我们可以理解为读取json文件然后unity已经把json文件的序列化对象做好了。我们直接实例即可。最开始我们需要获得这个json文件的字符串,我们是通过:
[PostProcessBuild]
public static void OnPostprocessBuild(BuildTarget buildTarget, string path)
{
if (buildTarget == BuildTarget.iOS)
{}
}
通过unity自带的一个方法OnPostprocessBuild,这个方法会在我们打包导工程的时候调用。然后我们根据路径读出字符串即可。
//获得proj文件
string projPath = PBXProject.GetPBXProjectPath(path);
PBXProject xcodeProj = new PBXProject();
xcodeProj.ReadFromString(File.ReadAllText(projPath));
这里获得了proj的对象后,在对其做一些属性的修改。
var targetName = xcodeProj.TargetGuidByName(PBXProject.GetUnityTargetName());
//添加依赖库
xcodeProj.AddFrameworkToProject(targetName, "libz.dylib", true);
xcodeProj.AddFrameworkToProject(targetName, "MessageUI.framework", true);
//设置关闭bitcode
xcodeProj.SetBuildProperty(targetName, "ENABLE_BITCODE", "NO");
//添加苹果自带功能
xcodeProj.AddCapability(targetName, PBXCapabilityType.GameCenter);
//保存工程
xcodeProj.WriteToFile(projPath);
然后对工程中的info.plist设置也是同样的。做法先读出来然后直接设置即可。
//修改plist
var plistPath = Path.Combine(path, "Info.plist");
PlistDocument plist = new PlistDocument();
plist.ReadFromString(File.ReadAllText(plistPath));
var rootDict = plist.root;
// 语音权限
rootDict.SetString("NSMicrophoneUsageDescription", "是否允许此游戏使用麦克风?");
// 地址权限
rootDict.SetString("NSLocationAlwaysUsageDescription", "");
rootDict.SetString("NSLocationUsageDescription", "");
rootDict.SetString("NSLocationWhenInUseUsageDescription", "");
//保存plist
plist.WriteToFile(plistPath);
File.WriteAllText(projPath,xcodeProj.WriteToString());
工具
我们又想了如果我们每次打包修改一个原则,添加一个sdk需要加一些权限啥的有需要改代码,这得多麻烦。就想要不直接在unity里面做一个xcode的配置表。这样就完美遵守开封闭原则。
这次我机制的在网上搜索了一下,果不其然有老哥跟我的想法一样,试试了这个工具,相当的完善靠谱啊!
看到没,功能是不是很完善!很厉害!下面还有一些功能,替换脚本,修改脚本啥的!
这个是工具工程GitHub
我打了一个unity package包,可以直接用这个。
参考文章:
https://answers.unity.com/questions/1074471/is-it-possible-to-use-the-xcode-manipulation-api-t.html
https://blog.csdn.net/blog_lee/article/details/52400535
http://www.xuanyusong.com/archives/4026
https://docs.unity3d.com/ScriptReference/iOS.Xcode.PBXProject.html