当前位置:   article > 正文

Unity 自动打包 Part1—配置Xcode工程_unity xcode 自动编译脚本

unity xcode 自动编译脚本

目录

1. 代码仓库

2. 代码展示

3. Feature 2017.3.29 设置Xcode Capabilities

4. Add Localizations 2017-04-07

5. 构建API

6. XUPorter 不建议使用

7. 新问题-2017.10.27


0.最近更新

添加微信SDK导出,修改xcode工程 添加plist scheme。

 

1.代码仓库


下载地址: https://bitbucket.org/Unity-Technologies/xcodeapi


2.代码展示

支持:Unity : 5.4.1p1+   /   Xcode: 8.1+

PostProcessBuild (在Unity编译的最后加入了一个脚本调用的命令,会自动搜索Editor文件夹下的PostprocessBuildPlayer,并进行调用)。

  • 主函数入口

  1. public override void OnPostprocessBuild (BuildTarget BuildTarget, string path){
  2. if (BuildTarget == BuildTarget.iOS) {
  3. string projPath = PBXProject.GetPBXProjectPath (path);
  4. PBXProject proj = new PBXProject ();
  5. proj.ReadFromString (File.ReadAllText (projPath));
  6. generateProjFile (proj, path);//处理Xcode工程
  7. string plistPath = path + "/Info.plist";
  8. PlistDocument plist = new PlistDocument ();
  9. plist.ReadFromString (File.ReadAllText (plistPath));
  10. generatePlistFile (plist.root, path);//处理plist文件
  11. File.WriteAllText (projPath, proj.WriteToString ());
  12. File.WriteAllText (plistPath, plist.WriteToString ());
  13. this.ParseIcon ();
  14. /*
  15. this.ParseSplashXLib (new Color (34 / 255f, 44 / 255f, 55 / 255f));//修改背景色
  16. this.Buildipa();//代码请见Part2博客
  17. generateFBSettingsConfig();// FaceBook SDK
  18. generateHelpShiftConfig();//Helpshift SDK
  19. */
  20. }
  21. }
  • 处理Xcode工程配置

  1. private void generateProjFile(PBXProject proj,string path){
  2. string target = proj.TargetGuidByName (PBXProject.GetUnityTargetName ());
  3. var codesign = Debug.isDebugBuild ? "iPhone Developer: xxxxxxxxxxx" : "iPhone Distribution: xxxxxxxx";
  4. var provision = Debug.isDebugBuild ? "xxxxx" : "xxxxx";
  5. proj.SetBuildProperty (target, "CODE_SIGN_IDENTITY", codesign);
  6. proj.SetBuildProperty (target, "PROVISIONING_PROFILE_SPECIFIER", provision);
  7. proj.SetBuildProperty (target, "CODE_SIGN_ENTITLEMENTS", "KeychainAccessGroups.plist");
  8. proj.SetBuildProperty (target, "DEVELOPMENT_TEAM", "xxxxxxxxxx");
  9. proj.SetBuildProperty (target, "ENABLE_BITCODE", "NO");
  10. proj.SetSystemCapabilities (target, "com.apple.Push", "1");
  11. proj.SetSystemCapabilities (target, "com.apple.GameCenter", "1");
  12. proj.SetSystemCapabilities (target, "com.apple.InAppPurchase", "1");
  13. proj.RemoveFilesByProjectPathRecursive ("Libraries/Plugins/Android"); // 移除某个目录,根据开发者需求
  14. proj.AddBuildProperty (target, "HEADER_SEARCH_PATHS", Application.dataPath + "/_PlatformAssets/Platforms/xxxxxxxx");//修改Xcode索引目录
  15. //keychain
  16. proj.AddFile (Application.dataPath + "你的目录/KeychainAccessGroups.plist", "KeychainAccessGroups.plist");
  17. proj.SetBuildProperty (target, "CODE_SIGN_ENTITLEMENTS", Application.dataPath + "你的目录/KeychainAccessGroups.plist");
  18. // weixin framework
  19. // proj.AddFrameworkToProject (target, "SystemConfiguration.framework", false);
  20. // SvUDIDTools是UDID文件,可以忽略。
  21. // AddFile添加文件到Xcode目录,返回文件GUID
  22. // AddFileToBuild功能是将GUID文件添加到Xcode BuildPhases阶段
  23. var fileGUID = "";
  24. fileGUID = proj.AddFile (Application.dataPath + "你的目录/SvUDIDTools.h", "Libraries/Plugins/IOS/SvUDIDTool/SvUDIDTools.h");
  25. proj.AddFileToBuild (target, fileGUID);
  26. fileGUID = proj.AddFile (Application.dataPath + "你的目录/SvUDIDTools.m", "Libraries/Plugins/IOS/SvUDIDTool/SvUDIDTools.m");
  27. proj.AddFileToBuild (target, fileGUID);//添加到Xcode BuildPhases阶段
  28. // localizable 自动添加Xcode语言文件
  29. var infoDirs = Directory.GetDirectories (Application.dataPath + "你的目录/lang/infoplist/");
  30. for (var i = 0; i < infoDirs.Length; ++i) {
  31. var files = Directory.GetFiles (infoDirs [i], "*.strings");
  32. proj.AddLocalization (files [0], "InfoPlist.strings", "InfoPlist.strings");
  33. }
  34. var localdirs = Directory.GetDirectories (Application.dataPath + "你的目录/lang/localizable/");
  35. for (var i = 0; i < localdirs.Length; ++i) {
  36. var files = Directory.GetFiles (localdirs [i], "*.strings");
  37. proj.AddLocalization (files [0], "Localizable.strings", "Localizable.strings");
  38. }
  39. fileGUID = proj.AddFile (Application.dataPath + "/Plugins/IOS/notificationsound.caf", "notificationsound.caf"); // 添加推送音效
  40. proj.AddFileToBuild (target, fileGUID);
  41. }
  • 处理plist文件内容

  1. private void generatePlistFile(PlistElementDict rootDict,string path){
  2. rootDict.SetString ("CFBundleIdentifier", "com.gekko.rok");
  3. rootDict.SetString ("CFBundleDisplayName", "Rage of Kings");
  4. rootDict.SetString ("CFBundleVersion", GetVer ());
  5. rootDict.SetString ("NSPhotoLibraryUsageDescription", "Use Photo");
  6. rootDict.SetString ("NSCameraUsageDescription", "Use Camera");
  7. rootDict.SetString ("CFBundleShortVersionString", GKVersion.GAME_VERSION);
  8. rootDict.SetString ("ITSAppUsesNonExemptEncryption", "false");
  9. rootDict.SetString ("LSHasLocalizedDisplayName","true");
  10. // weixin scheme
  11. PlistElementArray urlArray = null;
  12. if (!rootDict.values.ContainsKey ("CFBundleURLTypes")) {
  13. urlArray = rootDict.CreateArray ("CFBundleURLTypes");
  14. } else {
  15. urlArray = rootDict.values ["CFBundleURLTypes"].AsArray ();
  16. }
  17. var urlTypeDict = urlArray.AddDict();
  18. urlTypeDict.SetString("CFBundleURLName", "weixin");
  19. var urlScheme = urlTypeDict.CreateArray("CFBundleURLSchemes");
  20. urlScheme.AddString("weixin_id");
  21. if (!rootDict.values.ContainsKey ("LSApplicationQueriesSchemes")) {
  22. urlArray = rootDict.CreateArray ("LSApplicationQueriesSchemes");
  23. } else {
  24. urlArray = rootDict["LSApplicationQueriesSchemes"].AsArray();
  25. }
  26. urlArray.AddString ("weixin");
  27. // Gamecenter
  28. if (rootDict.values.ContainsKey ("UIRequiredDeviceCapabilities")) {
  29. rootDict.values.Remove ("UIRequiredDeviceCapabilities");
  30. }
  31. var arr = rootDict.CreateArray ("UIRequiredDeviceCapabilities");
  32. arr.AddString ("armv7");
  33. arr.AddString ("gamekit");
  34. }
  • 处理Icon 

  1. protected void ParseIcon(){
  2. string sourcePath = "/_ExportTextures/appIcon/{0}.png";
  3. var icoList = new List<string> () {
  4. "Icon",
  5. "Icon-72",
  6. "Icon-76",
  7. "Icon-120",
  8. "Icon@2x",
  9. "Icon-144",
  10. "Icon-152",
  11. "Icon-167",
  12. "Icon-180",
  13. "Icon-Store"//1024*1024 , xcode9+
  14. };
  15. foreach (var ico in icoList) {
  16. File.Copy (Application.dataPath + string.Format (sourcePath, ico), XCodeProjectMod.XcodePath() + string.Format ("/Unity-iPhone/Images.xcassets/AppIcon.appiconset/{0}.png", ico), true);
  17. }
  18. }
  • 处理背景色

  1. //using System.Xml;
  2. protected void ParseSplashXLib(Color color){
  3. Action<string> ModifyXML = (xmlPath) => {
  4. XmlDocument xmlDoc = new XmlDocument ();
  5. xmlDoc.Load (xmlPath);
  6. XmlNodeList nodelist = xmlDoc.SelectSingleNode ("document").ChildNodes;
  7. foreach (XmlElement item in nodelist) {
  8. if (item.Name == "objects") {
  9. foreach (XmlElement item1 in item.ChildNodes) {
  10. if (item1.Name == "view") {
  11. foreach (XmlElement item2 in item1.ChildNodes) {
  12. if (item2.Name == "color") {
  13. item2.SetAttribute ("red", color.r.ToString ());
  14. item2.SetAttribute ("green", color.g.ToString ());
  15. item2.SetAttribute ("blue", color.b.ToString ());
  16. item2.SetAttribute ("alpha", color.a.ToString ());
  17. }
  18. }
  19. }
  20. }
  21. }
  22. }
  23. xmlDoc.Save (xmlPath);
  24. };
  25. ModifyXML (XCodeProjectMod.XcodePath () + "/LaunchScreen-iPhone.xib");
  26. ModifyXML (XCodeProjectMod.XcodePath () + "/LaunchScreen-iPad.xib");
  27. }

 

3.Feature 2017.3.29 设置Xcode Capabilities

  1. SetSystemCapabilities函数实现 //proj.SetSystemCapabilities (target, "com.apple.Push","1")
  2. //PBXProjects.cs文件
  3. public void SetSystemCapabilities(string target,string key,string value){
  4. project.project.SetSystemCapabilities (target, key, value);
  5. }
  6. //找到Objects.cs => internal class PBXProjectObjectData : PBXObjectData类内添加此函数
  7. public void SetSystemCapabilities(string target,string key,string value){
  8. if (m_Properties.Contains ("attributes")) {
  9. var attributes = m_Properties ["attributes"].AsDict ();
  10. var targetAttributes = attributes ["TargetAttributes"].AsDict ();
  11. if (targetAttributes.Contains (target)) {
  12. var targetDict = targetAttributes [target].AsDict ();
  13. if (!targetDict.Contains ("SystemCapabilities")) {
  14. var dict = targetDict.CreateDict ("SystemCapabilities");
  15. var record = dict.CreateDict (key);
  16. record.SetString ("enabled", value);
  17. } else {
  18. var dict = targetDict ["SystemCapabilities"].AsDict ();
  19. if (!dict.Contains (key)) {
  20. var record = dict.CreateDict (key);
  21. record.SetString ("enabled", value);
  22. } else {
  23. var record = dict [key].AsDict ();
  24. record.SetString ("enabled", value);
  25. }
  26. }
  27. } else {
  28. //error
  29. }
  30. }
  31. }

4.Add Localizations 2017-04-07

添加本地化文件此功能没有进入到stable分支, 而是在pull requests内  。
https://bitbucket.org/Unity-Technologies/xcodeapi/pull-requests/13/creation-of-variantgroup-and/diff

代码需要自己移植到项目内,语言文件需要自己首先在Xcode工程里创建好,然后拷贝到Unity Assets内。

我的Unity文件目录:

示例代码:

  1. var infoDirs = Directory.GetDirectories (Application.dataPath + "/IOS/lang/infoplist/");
  2. for (var i = 0; i < infoDirs.Length; ++i) {
  3. var files = Directory.GetFiles (infoDirs [i], "*.strings");
  4. proj.AddLocalization (files [0], "InfoPlist.strings", "InfoPlists.strings");
  5. }
  6. var localdirs = Directory.GetDirectories (Application.dataPath + "/IOS/lang/localizable/");
  7. for (var i = 0; i < localdirs.Length; ++i) {
  8. var files = Directory.GetFiles (localdirs [i], "*.strings");
  9. proj.AddLocalization (files [0], "Localizable.strings", "Localizable.strings");
  10. }


最终会在Xcode工程内出现下图内容:

5.构建API

  1. case Configuration.Debug:
  2. BuildPipeline.BuildPlayer (GetBuildScenes(),XcodePath(),BuildTarget.iOS,BuildOptions.AllowDebugging | BuildOptions.SymlinkLibraries | BuildOptions.Development);
  3. break;
  4. case Configuration.Release:
  5. BuildPipeline.BuildPlayer (GetBuildScenes(),XcodePath(),BuildTarget.iOS,BuildOptions.None);
  6. break;

  *上面贴的代码是调用unity build命令,开始build。

  *可以添加Menu Item 功能菜单,点击Item按钮调用代码,自动打包构建Xcode工程,上传bugly,发邮件通知(都已实现)

6.XUPorter 不建议使用

之前用的是这款开源工具,现该项目作者已不维护,Unity5.x 之后版本更换方式。

7. 新问题-2017.10.27

新版本的Unity 2017 有一些问题。暂时降级Unity 5.6.4p3

Xcode升级到Xcode9 ,打包会遇到一些问题。Xcode9打包解决方案

8. 下一步

Unity 自动打包 Part2—构建IPA文件

Unity 自动打包 Part3—上传Bugly 邮件通知

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号