mac unity一键化打ipa_2 编写sh脚本和unity脚本
参考博客: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脚本相关推荐
- apktoolkit apk反编译没有文件_[工具] Mac下一键APK逆向环境
安装apktool和dex2jar,jd-gui homebrew安装: brew install apktool brew install dex2jar JD-GUI去http://jd.beno ...
- ubuntu一键化部署方案
ubuntu一键化部署方案 近来对于开发的项目进行部署,每次都是先下载相关的软件,拷贝的指定的位置然后解压,配置path,将工程拷贝到指定的位置修改相关度额配置文件,十分麻烦和费时,能不能把事情尽量简 ...
- python文本分类汇总_用Python解决海量数据的分类汇总一键化办公的神器!
现实的创作来源于生活的灵感! 项目引入 昨天突然发现有一个比较头疼的问题,有一份数据是某一个学校的寝室数据,有不同的维度的分类,总的数据大概有4000数据,需要进行分类,然后按照不同分类维度进行表格制 ...
- python文本分类汇总_用Python解决海量数据的分类汇总~一键化办公的神器!
现实的创作来源于生活的灵感! 项目引入 昨天突然发现有一个比较头疼的问题,有一份数据是某一个学校的寝室数据,有不同的维度的分类,总的数据大概有4000数据,需要进行分类,然后按照不同分类维度进行表格制 ...
- 用Python解决海量数据的分类汇总~一键化办公的神器!
项目引入 昨天突然发现有一个比较头疼的问题,有一份数据是某一个学校的寝室数据,有不同的维度的分类,总的数据大概有4000数据,需要进行分类,然后按照不同分类维度进行表格制作,最后生成8个文件夹,每个文 ...
- Asp.net Core Jenkins Docker 实现一键化部署
写在前面 在前段时间尝试过用Jenkins来进行asp.net core 程序在IIS上面的自动部署.大概的流程是Jenkins从git上获取代码 最开始Jenkins是放在Ubuntu的Docker ...
- Linux qt程序打包依赖库,Linux打包免安装的Qt程序(编写导出依赖包的脚本copylib.sh,程序启动脚本MyApp.sh)...
本文介绍如何打包Qt程序,使其在没有安装Qt的系统可以运行. 默认前提:另外一个系统和本系统是同一个系统版本. 1,编写导出依赖包的脚本copylib.sh #!/bin/bash LibDir=$P ...
- DR5白金版 for mac(PS一键磨皮插件Delicious Retouch)支持ps 2022
Delicious Retouch 5简称DR5,这是非常受欢迎的一款PS一键磨皮插件,dr5插件提供了人像磨皮.平滑皮肤.去除瑕疵.美白牙齿.美白皮肤.修饰眼部等功能,一键点击即可使用,这次的PS磨 ...
- 一键安装nginx(auto_nginx_install.sh
#!/bin/bash#auto install nginx#by 杨进 2021-02#nginx define path variable#加入变量后期维护更加简单,智能化#替换所有的的 %s#y ...
最新文章
- 刚刚!美国官宣100000名 IT 人失业,感觉很慌 !
- Windows 技术篇-win7利用系统自带工具关闭开机启用程序,不使用杀毒软件设置开机启动项
- Spring boot的Thymeleaf默认规则
- kibana升级之后原本保存的数据dashboards, visualizations, index patterns丢失
- include php 失效,为什么include(‘php:// input’)不起作用?
- Java中的数据库架构导航
- Behavior Targeting - 技术研究
- python2中可以使用print()函数吗_Python3中的 print 函数有哪些用法?
- 心音与心电信号分析之一--6.26--心音信号数字滤波
- 请检查 PHP 或网站服务器日志,并正确配置 PHP 安装
- 性能测试学习线路图(建议)
- (一)密码学之数论基础
- 文库下载软件 冰点文库下载器 软件 百度网盘链接地址
- 按键精灵手机助手错误:at tempt to compare nu11 with number
- 常见Http Method有哪些
- 科大讯飞麦克风阵列AIUI开放平台基本操作初级
- Cesium中的儒略日JulianDate
- 知识产权服务机构列表
- Android跳转淘宝商品详情页代码
- 防止电脑休眠锁屏、防止休眠锁定、防止电脑休眠的小工具 —— 定时执行专家