参考博客: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 (存盘退出)
五、最后运行: