参考博客: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

mac unity一键化打ipa_2 编写sh脚本和unity脚本

四、运行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脚本
 

 

相关文章: