参考博客:https://www.xuanyusong.com/archives/2734

主要就是查API,编写

jenkins调用sh脚本->mac的sh脚本调用unity的C#脚本

关于插件:下载unity官方XCode插件

https://bitbucket.org/Unity-Technologies/xcodeapi/downloads/

分享:链接:https://pan.baidu.com/s/1DcrHt_f7eg1jNXFdxuwmug 提取码:8kga

二、编写sh脚本

关于:BuildIos.sh脚本

#!/bin/sh
# unity app path
UNITY_PATH=/Applications/Unity/Unity.app/Contents/MacOS/Unity#root path
PRJECT_ROOT_PATH=/Users/chenpeng# project path TODO
PROJECT_PATH=${PRJECT_ROOT_PATH}/Test_Ios_Build#IOS打包脚本路径#
BUILD_IOS_PATH=${PRJECT_ROOT_PATH}/ipa_build.sh#生成的log路径#
UNITY_LOG_PATH=${PROJECT_PATH}/../log.txt#将unity导出成xcode工程#
echo "============== Unity Build XCode Project Begin =============="
$UNITY_PATH -projectPath $PROJECT_PATH  -logFile $UNITY_LOG_PATH  -executeMethod XcodeProjectBuild.BuildXCodeInfo project-${companyName}-${productName}-${bundleVersion}-${build_type}-${bundleIdentifier}-${teamId} -quit -batchmode
echo "============== Unity Build XCode Project Finish =============="#生成的Xcode工程路径#
XCODE_TRUE_PATH=${PROJECT_PATH}/IOSBuild
#生成的ipa的相对路径#
IPA_PATH=ipa
#开始生成ipa#
echo "============== Unity Build IPA Begin =============="
echo $XCODE_TRUE_PATH
echo $IPA_PATH
echo $BUILD_IOS_PATH$BUILD_IOS_PATH $XCODE_TRUE_PATH $IPA_PATH
echo "============== Unity Build IPA Finish =============="

关于ipa_build.sh脚本:

#!/bin/sh
# 参数判断
if [ $# != 2 ];then  echo "Need two params: 1.path of project 2.name of ipa file"  exit
elif [ ! -d $1 ];then  echo "The first param is not a dictionary."  exit
fi
# 工程路径
xcode_project_path=$1  # IPA名称
ipa_name=$2  # build文件夹路径
build_path=${xcode_project_path}/build  archive_path=${build_path}/Archive/AutoBuild.xcarchive# 清理#
xcodebuild clean# 编译工程
cd $xcode_project_path
xcodebuild || exit  xcodebuild archive \
-project ${xcode_project_path}/Unity-iPhone.xcodeproj \
-scheme Unity-iPhone \
-configuration "Release" \
-archivePath ${archive_path}xcodebuild -exportArchive \
-exportOptionsPlist ${xcode_project_path}/info.plist \
-archivePath ${archive_path} \
-exportPath ${xcode_project_path}

三、编写c#打包配置脚本:

https://support.unity3d.com/hc/en-us/articles/207942813-How-can-I-disable-Bitcode-support-

目前XCode没有接入FrameWork,基本需求:

1)实现设置unity的BuildSetting

2)实现设置XCode的bitCode状态

using UnityEngine;
using System.Collections.Generic;using System.IO;
#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode.Custom;
#endif/// <summary>
/// study from
/// https://www.jianshu.com/p/7a9a334a79a6
/// http://www.xuanyusong.com/archives/2720
/// https://blog.csdn.net/xiao756757373xiao/article/details/78286293
/// 一键化打包IOS
/// </summary>
public static class XcodeProjectBuild
{public class BuildConf{public string companyName = "mirroringtech";public string productName = "tankwar";public string bundleVersion = "tankwar";public bool isDebug = true;public string bundleIdentifier = "com.galaxywar.tank";public string teamId = "";}static BuildConf GetBuildConf(){BuildConf conf = null;//在这里分析shell传入的参数string[] args = System.Environment.GetCommandLineArgs();if (args != null){foreach (string arg in args){if (arg.StartsWith("project-")){conf = new BuildConf();string[] confStr = arg.Split('-');conf.companyName = confStr[1];conf.productName = confStr[2];conf.bundleVersion = confStr[3];conf.isDebug = confStr[4] == "debug" ? true : false;conf.bundleIdentifier = confStr[5];conf.teamId = confStr[6];Debug.Log("conf.isDebug:"+ conf.isDebug);Debug.Log("conf.teamI:" + conf.teamId);return conf;}}}return null;}static void BuildXCodeInfo(){BuildConf conf = GetBuildConf();if (conf == null) { Debug.LogError("Build Conf Is Wrong!"); return; }SetUnityBuildSetting(conf);BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();buildPlayerOptions.scenes = GetBuildScenes();buildPlayerOptions.locationPathName = "iOSBuild";buildPlayerOptions.target = BuildTarget.iOS;buildPlayerOptions.options = EditorUserBuildSettings.development ? BuildOptions.Development | BuildOptions.AllowDebugging : BuildOptions.None;        PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.iOS, "USE_SHARE");BuildPipeline.BuildPlayer(buildPlayerOptions);}public static void SetUnityBuildSetting(BuildConf buildConf){PlayerSettings.companyName = buildConf.companyName;PlayerSettings.productName = buildConf.productName;PlayerSettings.bundleVersion = buildConf.bundleVersion;EditorUserBuildSettings.development = buildConf.isDebug;PlayerSettings.SetApplicationIdentifier(BuildTargetGroup.iOS, buildConf.bundleIdentifier);if (EditorUserBuildSettings.development){PlayerSettings.iOS.appleEnableAutomaticSigning = true;PlayerSettings.iOS.appleDeveloperTeamID = buildConf.teamId;}else{//TODO 不知道release版本什么设置}}//在这里找出你当前工程所有的场景文件,假设你只想把部分的scene文件打包 那么这里可以写你的条件判断 总之返回一个字符串数组。static string[] GetBuildScenes(){List<string> names = new List<string>();foreach (EditorBuildSettingsScene e in EditorBuildSettings.scenes){if (e == null)continue;if (e.enabled)names.Add(e.path);}return names.ToArray();}#if UNITY_EDITOR[PostProcessBuild(100)]public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProject){if (target != BuildTarget.iOS){Debug.LogWarning("Target is not iPhone. XCodePostProcess will not run");return;}Debug.Log("OnPostProcessBuild");PBXProject _pbx_proj = new PBXProject();string proj_path = PBXProject.GetPBXProjectPath(pathToBuiltProject);_pbx_proj.ReadFromString(File.ReadAllText(proj_path));string xcode_target = _pbx_proj.TargetGuidByName(PBXProject.GetUnityTargetName());SetBuildProperty(_pbx_proj, xcode_target);File.WriteAllText(proj_path, _pbx_proj.WriteToString());_pbx_proj.WriteToFile(proj_path);}public static void SetBuildProperty(PBXProject _pbx_proj, string target){//项目需要设置BitCode为no,才能正常打包_pbx_proj.SetBuildProperty(target, "ENABLE_BITCODE", "false");//添加依赖库//_pbx_proj.AddFrameworkToProject(target, "libz.dylib", true);//_pbx_proj.AddFrameworkToProject(target, "MessageUI.framework", true);}#endif
}
//修改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());

四、找不到TeamID,mac机器上进入钥匙串,找到组织单位就是teamId

四、运行sh脚本报错:

1)Permission denied!

终端开放权限:chmod 777 sh文件路径

2)/bin/bash^M: bad interpreter: No such file or directory

问题:文本格式

解决方法:

(1)使用vi工具     vi test.sh
(2)利用如下命令查看文件格式 
     :set ff 或 :set fileformat 
     可以看到如下信息 
     fileformat=dos 或 fileformat=unix 
(3) 利用如下命令修改文件格式 
     :set ff=unix 或 :set fileformat=unix 
     :wq (存盘退出)

五、最后运行:

mac unity一键化打ipa_2 编写sh脚本和unity脚本相关推荐

  1. apktoolkit apk反编译没有文件_[工具] Mac下一键APK逆向环境

    安装apktool和dex2jar,jd-gui homebrew安装: brew install apktool brew install dex2jar JD-GUI去http://jd.beno ...

  2. ubuntu一键化部署方案

    ubuntu一键化部署方案 近来对于开发的项目进行部署,每次都是先下载相关的软件,拷贝的指定的位置然后解压,配置path,将工程拷贝到指定的位置修改相关度额配置文件,十分麻烦和费时,能不能把事情尽量简 ...

  3. python文本分类汇总_用Python解决海量数据的分类汇总一键化办公的神器!

    现实的创作来源于生活的灵感! 项目引入 昨天突然发现有一个比较头疼的问题,有一份数据是某一个学校的寝室数据,有不同的维度的分类,总的数据大概有4000数据,需要进行分类,然后按照不同分类维度进行表格制 ...

  4. python文本分类汇总_用Python解决海量数据的分类汇总~一键化办公的神器!

    现实的创作来源于生活的灵感! 项目引入 昨天突然发现有一个比较头疼的问题,有一份数据是某一个学校的寝室数据,有不同的维度的分类,总的数据大概有4000数据,需要进行分类,然后按照不同分类维度进行表格制 ...

  5. 用Python解决海量数据的分类汇总~一键化办公的神器!

    项目引入 昨天突然发现有一个比较头疼的问题,有一份数据是某一个学校的寝室数据,有不同的维度的分类,总的数据大概有4000数据,需要进行分类,然后按照不同分类维度进行表格制作,最后生成8个文件夹,每个文 ...

  6. Asp.net Core Jenkins Docker 实现一键化部署

    写在前面 在前段时间尝试过用Jenkins来进行asp.net core 程序在IIS上面的自动部署.大概的流程是Jenkins从git上获取代码 最开始Jenkins是放在Ubuntu的Docker ...

  7. Linux qt程序打包依赖库,Linux打包免安装的Qt程序(编写导出依赖包的脚本copylib.sh,程序启动脚本MyApp.sh)...

    本文介绍如何打包Qt程序,使其在没有安装Qt的系统可以运行. 默认前提:另外一个系统和本系统是同一个系统版本. 1,编写导出依赖包的脚本copylib.sh #!/bin/bash LibDir=$P ...

  8. DR5白金版 for mac(PS一键磨皮插件Delicious Retouch)支持ps 2022

    Delicious Retouch 5简称DR5,这是非常受欢迎的一款PS一键磨皮插件,dr5插件提供了人像磨皮.平滑皮肤.去除瑕疵.美白牙齿.美白皮肤.修饰眼部等功能,一键点击即可使用,这次的PS磨 ...

  9. 一键安装nginx(auto_nginx_install.sh

    #!/bin/bash#auto install nginx#by 杨进 2021-02#nginx define path variable#加入变量后期维护更加简单,智能化#替换所有的的 %s#y ...

最新文章

  1. 刚刚!美国官宣100000名 IT 人失业,感觉很慌 !
  2. Windows 技术篇-win7利用系统自带工具关闭开机启用程序,不使用杀毒软件设置开机启动项
  3. Spring boot的Thymeleaf默认规则
  4. kibana升级之后原本保存的数据dashboards, visualizations, index patterns丢失
  5. include php 失效,为什么include(‘php:// input’)不起作用?
  6. Java中的数据库架构导航
  7. Behavior Targeting - 技术研究
  8. python2中可以使用print()函数吗_Python3中的 print 函数有哪些用法?
  9. 心音与心电信号分析之一--6.26--心音信号数字滤波
  10. 请检查 PHP 或网站服务器日志,并正确配置 PHP 安装
  11. 性能测试学习线路图(建议)
  12. (一)密码学之数论基础
  13. 文库下载软件 冰点文库下载器 软件 百度网盘链接地址
  14. 按键精灵手机助手错误:at tempt to compare nu11 with number
  15. 常见Http Method有哪些
  16. 科大讯飞麦克风阵列AIUI开放平台基本操作初级
  17. Cesium中的儒略日JulianDate
  18. 知识产权服务机构列表
  19. Android跳转淘宝商品详情页代码
  20. 防止电脑休眠锁屏、防止休眠锁定、防止电脑休眠的小工具 —— 定时执行专家

热门文章

  1. JavaScript(第三周上)
  2. div css圆环布局,CSS圆环样式
  3. Python一句代码生成验证码多少位都可以!!!!
  4. (二)《数据结构与算法》 青岛大学-王卓 线性表 C++
  5. 在线播放mp3代码(dewplayer)
  6. 使用ZXing实现二维码扫描
  7. word07 插入目录以及遇到的问题解决
  8. pymongo.errors.ServerSelectionTimeoutError
  9. Fiddler (四) 实现手机的抓包 - 小坦克
  10. 解决 Python百度云bypy包 授权失败问题