Unity 自动化打包XCode工程

每次打包都要手动修改Xcode的各种配置,于是研究了一下通过Unity提供的API设置XCode的各种配置


XCode签名

  • 在我使用的Unity版本中(Unity2018.2)可以通过代码为XCode签名,PlayerSetting还可以设置权限等各种设置,具体请自行查看API:
//xxxx为你的证书的ID
PlayerSettings.iOS.appleDeveloperTeamID = xxxx;
PlayerSettings.iOS.appleEnableAutomaticSigning = true;
  • unity提供一套api去修改xcode项目工程配置以及修改plist文件内容(当unity build结束后, 会自动回调OnPostProcessBuild) 新建一个脚本实现OnPostProcessBuild
[PostProcessBuild]public static void OnPostprocessBuild(BuildTarget bulidTarget, string path){//Debug.Log("iOS 打包回调配置");if (bulidTarget != BuildTarget.iOS) return;//基础配置,得到工程的targetGuid string projectPath = PBXProject.GetPBXProjectPath(path);PBXProject project = new PBXProject();string fileText = File.ReadAllText(projectPath);project.ReadFromString((fileText));string targetGuid = project.TargetGuidByName(PBXProject.GetUnityTargetName());//"z.entitlemests"名字自取var capManager = new ProjectCapabilityManager(projectPath, "z.entitlements", PBXProject.GetUnityTargetName());//capability设置SetCapabilities(capManager);//BuildSettingSetBuidSetting(project, targetGuid, projectPath);//frameworkAddFramework(project, targetGuid, projectPath);//plist文件AddPlist(path);//代码AddiosCode(path);
}
  • 开启XCode Capabilities面板下的各种开关(列举两个,其它自查文档)
 private static void SetCapabilities(ProjectCapabilityManager manager){//推送manager.AddPushNotifications(true);//内购manager.AddInAppPurchase();manager.WriteToFile();}
  • 设置XCode自带的Framework,至于第三方库,放到Unity工程的Plungins/iOS目录下会自动引用

     string[] umengFrameworkArr = { "libz.dylib", "CoreTelephony.framework", "libz.tbd", "libsqlite3.tbd", "CoreGraphics.framework" };foreach (string str in umengFrameworkArr){project.AddFrameworkToProject(targetGuid,str,false);}
    
  • 设置XCode BuildSetting

   string linkerFlag = "OTHER_LDFLAGS";project.SetBuildProperty(targetGuid, "ENABLE_BITCODE", "NO");project.AddBuildProperty(targetGuid, linkerFlag, "-ObjC"); project.AddBuildProperty(targetGuid, linkerFlag, "-all_load");project.AddBuildProperty(targetGuid, linkerFlag, "-licucore");

效果如图:每个属性的名字在右边的Quick Help中可以看到

  • 修改Plist文件(以Umeng为例)
    static void AddPlist(string projPath){string plistPath = projPath + "/Info.plist";PlistDocument plist = new PlistDocument();plist.ReadFromString(File.ReadAllText(plistPath));PlistElementDict rootDic = plist.root;//不设置这项,提交时会显示缺少合规证明rootDic.SetBoolean("ITSAppUsesNonExemptEncryption", false);rootDic.SetString("NSCameraUsageDescription", "$(PRODUCT_NAME)想用下你的相机啦"); //相机rootDic.SetString("NSMicrophoneUsageDescription", "$(PRODUCT_NAME)想要使用麦克风");//microotDic.SetString("NSPhotoLibraryUsageDescription", "$(PRODUCT_NAME)想要访问相册");rootDic.SetString("NSLocationWhenInUseUsageDescription", "$(PRODUCT_NAME)需要获取您的当前位置");PlistElementArray urlTypes = rootDic.CreateArray("CFBundleURLTypes");string[] urlSchemes = { "微信key","腾讯qqKey","QQ16进制"};foreach(string str in urlSchemes){PlistElementDict typeRole = urlTypes.AddDict();typeRole.SetString("CFBundleTypeRole", "Editor");PlistElementArray urlScheme = typeRole.CreateArray("CFBundleURLSchemes");urlScheme.AddString(str);   }PlistElementArray queriesSchemes = rootDic.CreateArray("LSApplicationQueriesSchemes");string[] queriesArr = { "mqqapi","mqq","mqqOpensdkSSoLogin","mqqconnect","mqqopensdkdataline","mqqopensdkgrouptribeshare","mqqopensdkfriend","mqqopensdkapi","mqqopensdkapiV2","mqqopensdkapiV3","mqqopensdkapiV4","mqzoneopensdk","wtloginmqq","wtloginmqq2","mqqwpa","mqzone","mqzonev2","mqzoneshare","wtloginqzone","mqzonewx","mqzoneopensdkapiV2","mqzoneopensdkapi19","mqzoneopensdkapi","mqqbrowser","mttbrowser","wechat","weixin"};foreach(string str in queriesArr){queriesSchemes.AddString(str);  }PlistElementDict arbitraryLoad = rootDic.CreateDict("NSAppTransportSecurity");arbitraryLoad.SetBoolean("NSAllowsArbitraryLoads", true);File.WriteAllText(plistPath, plist.WriteToString());
  • 在Unity写iOS代码U3D似乎还没支持(反正我是没找到- -),所以我把XUPorter插件中的XClass脚本拿过来直接用了,具体使用方法以及相应脚本请自行百度
//根据路径获取OC文件
XClass UnityAppController = new XClass(projectPath+"/Classes/UnityAppController.mm");
//查找是否有#include "AppDelegateListener.h"这行代码,有的话则在这行代码下面添加#import<UMShare/UMShare.h>
UnityAppController.WriteBelow("#include \"PluginBase/AppDelegateListener.h\"","#import <UMShare/UMShare.h> ");
UnityAppController.WriteBelow("#include \"PluginBase/AppDelegateListener.h\"","#import \"UNUMConfigure.h\" ");
  • 最后附上XClass源码:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;public partial class XClass : System.IDisposable
{private string filePath;public XClass(string fPath){filePath = fPath;if (!System.IO.File.Exists(filePath)){Debug.LogError(filePath + "路径下文件不存在");return;}}public void WriteBelow(string below, string text){StreamReader streamReader = new StreamReader(filePath);string text_all = streamReader.ReadToEnd();streamReader.Close();if (text_all.Contains(text)) text_all.Replace(text, string.Empty);int beginIndex = text_all.IndexOf(below);if (beginIndex == -1){Debug.LogError(filePath + "中没有找到标致" + below);return;}int endIndex = text_all.LastIndexOf("\n", beginIndex + below.Length);text_all = text_all.Substring(0, endIndex) + "\n" + text + "\n" + text_all.Substring(endIndex);StreamWriter streamWriter = new StreamWriter(filePath);streamWriter.Write(text_all);streamWriter.Close();}public void Replace(string below, string newText){StreamReader streamReader = new StreamReader(filePath);string text_all = streamReader.ReadToEnd();streamReader.Close();int beginIndex = text_all.IndexOf(below);if (beginIndex == -1){Debug.LogError(filePath + "中没有找到标致" + below);return;}text_all = text_all.Replace(below, newText);StreamWriter streamWriter = new StreamWriter(filePath);streamWriter.Write(text_all);streamWriter.Close();}public void Dispose(){}
}
  • 自此完结,沟通交流请发邮件:744513163@qq.oom

Unity 自动化打包XCode工程相关推荐

  1. Unity自动化打包脚本

    Unity的项目手动打包确实很痛苦,得慢慢等着,好无聊,能自动化脚本打包什么的最好了,闲话不多说直接上脚本. ` windows的bat脚本echo offset companyName=" ...

  2. Unity:自动化打包脚本

    Unity的项目手动打包确实很痛苦,得慢慢等着,好无聊,能自动化脚本打包什么的最好了,闲话不多说直接上脚本. ` windows的bat脚本echo offset companyName=" ...

  3. Unity自动化打包脚本设置

    代码如下: using UnityEditor; using UnityEngine;public class PackageTools {[MenuItem("Tools/PerformB ...

  4. mac xcode自动化打包unity

    代码放下,供研究,后面给出一些坑 #!/bin/sh #UNITY程序的路径# UNITY_PATH=/Users/d11/Documents/Projects/unity2019/build/Mac ...

  5. TeamCity自动化打包Unity项目

    TeamCity是 JetBrains旗下的一款持续集成(Continuous Integration,简称CI)工具,开箱即用. 下载链接 https://www.jetbrains.com/tea ...

  6. Unity 打包 iOS 工程 替换Native 和 Data 时出错

    当我们用unity 打包x-code 工程时,一般会打包一个新的工程然后替换原始工程的 Native和Data文件夹.但是有时候替换会出现下图的问题! 在确定没有添加unity调用ios的方法或者有需 ...

  7. Unity脚本打包和Jenkins打包

    首先我们假设所有的环境和参数都配置好了. 常规打包: 打开Unity -> File -> Building Setting -> 点击 Build 按钮. 脚本打包:不需要打开Un ...

  8. Unity打包iOS自动拷贝1024图标到xcode工程中(上架AppStore需要设置1024*1024图标)

    前言 我们如果需要打iOS上架AppStore,则需要拷贝一张1024*1024的高清图标(不含alpha通道)到XCode工程中(目录:Unity-iPhone/Images.xcassets/Ap ...

  9. 【IOS自动化解放双手系列一】unity3D导出xcode 工程并配置各种权限

    打包是程序员必经之路.如何实现自动化是一个程序员的基本素质.(都是因为我懒,哈哈哈). 使用环境 :unity3D 2017.4.7 Mac Pro 打包分一下几个部分 : 1.unity3D导出xc ...

最新文章

  1. C# Obsolete
  2. spring 通过id 查询数据_Spring 数据初始 H2 后进行数据查询提示 Schema not found 错误...
  3. ROR no such file to load -- sqlite3 错误解决方法
  4. 玉溪推行电子政务 建设新型智慧城市
  5. jQuery 下载与安装教程
  6. 第一时间---Windows 7 with SP1中英文原版MSDN下载汇总---原汁原味
  7. Unity-UI-实现文本框内容自动滚动
  8. javascript手册安卓版_JavaScript 手册
  9. java velocity js_JavaScript 模板引擎 Velocity.js_js
  10. 黑客用“勒索病毒”展示肌肉,但你了解什么是“白帽黑客”吗?
  11. Java 创建PDF表单域 - 文本框、复选框、列表框、组合框、按钮等
  12. 关于Filename too long解决方法
  13. 一篇文了解电商直播的优势和平台
  14. 弹性蛋白(Elastin)检测试剂盒解决方案
  15. zz: 胡适:赠与今年的大学毕业生
  16. 中国电信189邮箱手机推送功能评测
  17. 移动端拍照上传到服务器
  18. 无线摄像头接有线如何改协议_家用摄像头安装有啥需要注意的地方?
  19. Js 高级学习教程
  20. QCSuper:在高通手机猫上捕获无线2G/3G/4G数据包

热门文章

  1. python二分查找时间复杂度_时间复杂度 二分查找
  2. 关于风险管理,如何将思维从项目升维到项目群?
  3. 关于游戏性的概念和实物
  4. ThreadPoolExecutor(二)——execute
  5. 07-小蜜蜂单片机中断系统
  6. 《流浪方舟》- 废土世界的冒险之旅
  7. Linux环境非root用户配置SSH免密登录(配置原理)
  8. 让人着迷的 STP生成树协议
  9. FPGA:开发环境Vivado的使用
  10. 关于98% after emitting CopyPlugin个人探索