代码放下,供研究,后面给出一些坑
#!/bin/sh
#UNITY程序的路径#
UNITY_PATH=/Users/d11/Documents/Projects/unity2019/build/MacEditor/Unity.app/Contents/MacOS/Unity
#游戏程序路径#
#test:::PROJECT_PATH="/Users/d11/Documents/TestPro"
PROJECT_PATH="/Users/d11/Documents/unlimited/project"
#IOS打包脚本路径#
BUILD_IOS_PATH=$PROJECT_PATH/../build_ipa.sh
#生成的Xcode工程路径#
XCODE_PATH=${PROJECT_PATH}/XcodeProject
#将unity导出成xcode工程#
#-logFile D:\Editor.log"
$UNITY_PATH -batchmode -projectPath $PROJECT_PATH -executeMethod ProjectBuild.BuildForIOS -quit
echo "XCODE工程生成完毕"
#开始生成ipa#
$BUILD_IOS_PATH $XCODE_PATH
echo "ipa生成完毕"
# #!/bin/bash
#参数判断
if [ ! -d $1 ];then
echo "The first param is not a dictionary."
exit
fi
#工程路径
PROJECT_PATH=$1
#导出路径
ARCHIVE_PATH=${PROJECT_PATH}/build/xxx.xcarchive
#plist路径
exportOptionsPlist_PATH=${PROJECT_PATH}/../Assets/Plugin/iOS/Info.plist
#输出ipa的文件路径
IPA_PATH=${PROJECT_PATH}/build
#清理#
xcodebuild clean
#编译工程
cd $PROJECT_PATH
xcodebuild archive -project Unity-iPhone.xcodeproj -scheme Unity-iPhone -archivePath ${ARCHIVE_PATH} -sdk iphoneos11.0 CONFIGURATION="Debug" ENABLE_BITCODE="NO" CODE_SIGN_IDENTITY="iPhone Developer: xxx (xxx)" PROVISIONING_PROFILE="xxx-xxx-xxx-xxx-xxx"
xcodebuild -exportArchive -archivePath ${ARCHIVE_PATH} -exportOptionsPlist ${exportOptionsPlist_PATH} -exportPath $IPA_PATH
#生产api
#-sdk :可以使用如下命令查看所支持的SDK. xcodebuild -showsdks
- 首先unity路径,是在Unity.app/Contents/MacOS/Unity下,而不是app
- 程序路径可能找不到,我放在的是/Users/Documents/ 前面有/
- 使用变量的时候需要加$符号,如果有多层记得用{}
- 自动签名时CODE_SIGN_IDENTITY与PROVISIONING_PROFILE要对应,PROVISIONING_PROFILE记得在/Users/d11/Library/MobileDevice/Provisioning Profiles下,不要加后缀.mobileprovision
- plist可以在archive以后,拷贝一下,加上对应的签名如下
<key>provisioningProfiles</key>
<dict>
<key>com.xxx.xxx</key>
<string>xxx-xxx-xx-xx-xxxxxx</string>
</dict>
<key>signingCertificate</key>
<string>iPhone Developer: xxx (xxxx)</string>
<key>ApplicationProperties</key>
- #plist路径 exportOptionsPlist_PATH=${PROJECT_PATH}/../Assets/Plugin/iOS/Info.plist 这个可以自己更换
- unity打包记得先switch,配置参数
-executeMethod ProjectBuild.BuildForIOS这个需要在Assets下的Editor下新建一个.cs:
using System.Collections;
using System.IO;
using UnityEditor;
using UnityEngine;
using System.Collections.Generic;
using System;
class ProjectBuild : Editor{
//在这里找出你当前工程所有的场景文件,假设你只想把部分的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();
}
//得到项目的名称
public static string projectName
{
get
{
//在这里分析shell传入的参数, 还记得上面我们说的哪个 project-$1 这个参数吗?
//这里遍历所有参数,找到 project开头的参数, 然后把-符号 后面的字符串返回,
//这个字符串就是 91 了。。
//foreach(string arg in System.Environment.GetCommandLineArgs()) {
//if(arg.StartsWith("project"))
//{
//return arg.Split("-"[0])[1];
//}
//}
return "test";
}
}
//shell脚本直接调用这个静态方法
static void BuildForIOS()
{
//打包之前先设置一下 预定义标签, 我建议大家最好 做一些 91 同步推 快用 PP助手一类的标签。 这样在代码中可以灵活的开启 或者关闭 一些代码。
//因为 这里我是承接 上一篇文章, 我就以sharesdk做例子 ,这样方便大家学习 ,
PlayerSettings.SetScriptingDefineSymbolsForGroup(BuildTargetGroup.iOS, "USE_SHARE");
//这里就是构建xcode工程的核心方法了,
//参数1 需要打包的所有场景
//参数2 需要打包的名子, 这里取到的就是 shell传进来的字符串 91
//参数3 打包平台
BuildPipeline.BuildPlayer(GetBuildScenes(), projectName, BuildTarget.iOS, BuildOptions.None);
}
}
- Bundle Identifier 要与注册的证书一致
-
欢迎遇到有问题可以一起讨论
- unity 打的Development包,对应Development的签名,不然匹配不上
- 签名的时候报错:
Signing for "Unity-iPhone" requires a development team. Select a development team in the project editor.
这个是因为unity生成xcode工程的时候有一个配置选项,去掉这个勾勾就好了,
之后显示
理论这里能直接配置签名的,暂时没试过。
更新xcode后,可能后导致一些问题:
1.-sdk iphoneos13.2 这个版本可能会变化
2.xcodebuild命令可能会出问题,可以试一下下面的命令
xcode-select --install
sudo xcode-select -switch /Library/Developer/CommandLineTools
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer