在unity3D 发布IOS的时候,我们经常会依赖一些 IOS 原生的架构 或者是集成 其他SDK 插件。
这个是好我们每次 build Xcode 项目都需要往里面添加 依赖结构 时分的不方便,其实Unity3d 已经为我们提供 很好的解决方案。
[PostProcessBuildAttribute(88)]
这个标签是在 Unity3D Build xcode 工程完成之后 调用的。目的就是 修改Xcode工程的 项目配置文件,可谓很强大
static string targetPath; //[PostProcessBuild] [PostProcessBuildAttribute(88)] public static void onPostProcessBuild(BuildTarget target, string targetPath) { string unityEditorAssetPath = Application.dataPath; if (target != BuildTarget.iOS) { Debug.LogWarning("Target is not iPhone. XCodePostProcess will not run"); return; } XCProject project = new XCProject(targetPath); string projPath = Path.GetFullPath(targetPath); EditInfoPlist(projPath); //Add Frameworks EditorFrameworks(project); //Add Lib EditorLib(project); //editorCode EditorCode(projPath); //Finally save the xcode project //project.Save(); }
在这里我们介绍第一种 添加 Frameworks
private static void EditorFrameworks(XCProject project) { string projPath = UnityEditor.iOS.Xcode.PBXProject.GetPBXProjectPath(targetPath); UnityEditor.iOS.Xcode.PBXProject proj = new UnityEditor.iOS.Xcode.PBXProject(); //proj.ReadFromString(File.ReadAllText(projPath)); proj.ReadFromFile(projPath); string target = proj.TargetGuidByName("Unity-iPhone"); proj.SetBuildProperty(target, "ENABLE_BITCODE", "NO");//bitcode NO proj.AddFrameworkToProject(target,"Messages.framework", true); proj.AddFrameworkToProject(target,"AdSupport.framework", true); proj.AddFrameworkToProject(target,"CoreTelephony.framework", true); proj.AddFrameworkToProject(target,"CoreMotion.framework", true); proj.AddFrameworkToProject(target,"Security.framework", true); proj.AddFrameworkToProject(target,"SystemConfiguration.framework", true); proj.WriteToFile (projPath); }
注意添加完成之后我回写到 配置文件中
第二种是添加 .tbd 的依赖文件(或许需要 Unity2017的支持 )
private static void EditorLib(XCProject project) { string projPath = UnityEditor.iOS.Xcode.PBXProject.GetPBXProjectPath(targetPath); //Debug.Log (projPath); UnityEditor.iOS.Xcode.PBXProject proj = new UnityEditor.iOS.Xcode.PBXProject(); //proj.ReadFromString(File.ReadAllText(projPath)); proj.ReadFromFile(projPath); string targetGuid = proj.TargetGuidByName("Unity-iPhone"); proj.AddFileToBuild(targetGuid, proj.AddFile("usr/lib/libstdc++.6.0.9.tbd", "libstdc++.6.0.9.tbd", PBXSourceTree.Sdk)); proj.AddFileToBuild(targetGuid, proj.AddFile("usr/lib/libsqlite3.tbd", "libsqlite3.tbd", PBXSourceTree.Sdk)); proj.AddFileToBuild(targetGuid, proj.AddFile("usr/lib/libc++.tbd", "libc++.tbd", PBXSourceTree.Sdk)); proj.AddFileToBuild(targetGuid, proj.AddFile("usr/lib/libz.tbd", "libz.tbd", PBXSourceTree.Sdk)); proj.WriteToFile (projPath); }
第三种 就是比较强悍的 替换代 把你整理好的代码。放在unity特定 目录中 每次 Build 成功之后 你把它替换掉 xcode 工程里面的文件就好。
private static void EditorCode(string projPath) { string UnityAppControllerH = Application.dataPath+ "/Editor/CPPCource/UnityAppController.h"; string UnityAppControllerMM = Application.dataPath + "/Editor/CPPCource/UnityAppController.mm"; string tagUnityAppControllerH = targetPath + "/Classes/UnityAppController.h"; string tagUnityAppControllerMM = targetPath + "/Classes/UnityAppController.mm"; if (File.Exists(tagUnityAppControllerH)) { File.Delete(tagUnityAppControllerH); } if (File.Exists(tagUnityAppControllerMM)) { File.Delete(tagUnityAppControllerMM); } File.Copy(UnityAppControllerH, tagUnityAppControllerH); File.Copy(UnityAppControllerMM, tagUnityAppControllerMM); }
以下添加 方式或许 需要 Unity2017的支持, 应为笔者 在unity5.6.3f1 中有编译错误的提示,需要新版本的API支持
第四中 添加 是以 添加 InAppPurchase 和 PushNotifications 和 GameCenter 等等
/// <summary> /// 包的自动签名 /// </summary>ÅÅÅ /// <param name="project">Project.</param> public static void AutoIdentity(XCProject project) { string projPath = UnityEditor.iOS.Xcode.PBXProject.GetPBXProjectPath(targetPath); UnityEditor.iOS.Xcode.PBXProject proj = new UnityEditor.iOS.Xcode.PBXProject(); proj.ReadFromString(File.ReadAllText(projPath)); string target = proj.TargetGuidByName("Unity-iPhone"); proj.SetBuildProperty(target, "ENABLE_BITCODE", "NO");//bitcode NO proj.SetTeamId (target, "93L6D5N68L"); //自动签名 自动选择证书 TeamID 可以在 appledeveloper 中查看 proj.WriteToFile (projPath); }
/// <summary> /// 添加 /// </summary> /// <param name="project">Project.</param> public static void AutoSign(XCProject project) { string projPath = UnityEditor.iOS.Xcode.PBXProject.GetPBXProjectPath(targetPath); UnityEditor.iOS.Xcode.PBXProject proj = new UnityEditor.iOS.Xcode.PBXProject(); proj.ReadFromFile(projPath); string target = proj.TargetGuidByName("Unity-iPhone"); proj.AddCapability (target, PBXCapabilityType.InAppPurchase);//内购 //添加推送和其他的有点不一样,需要添加一个文件。这个文件只能考进去。或者事先准备好了Base.entitlements 文件,文件类容 就是你手动添加进去的内容,你手动添加完成后生成的那个文件 string entitlement = Application.dataPath+ "/Editor/Entitlement/Base.entitlements"; File.Copy(entitlement, targetPath+"/Unity-iPhone/Base.entitlements"); proj.AddCapability (target, PBXCapabilityType.PushNotifications,targetPath+"/Unity-iPhone/Base.entitlements",true); proj.WriteToFile (projPath); }
以上我笔者 遇见的 添加依赖文件的种类,后续还有遇见的话 回继续修改