Xcode学习04:Shell自动化脚本打IPA包

张建 lol

前言

iOS 项目打包通常都是通过 Xcode -> Product -> Archive 去给项目打包,这是常用的方式,还有一种方式就是 shell脚本自动化打包,可以用一行代码解决打包问题,

实现

  1. 项目下创建 ZJ_Shell.sh 脚本文件,可以将该文件放在一个文件夹 Shell 下,也可以放在项目根目录下,具体看你设计实现方式

  1. ZJ_Shell.sh 文件中编写脚本
  • 使用方法 开始
1
2
3
4
5
6
7
8
#!/bin/sh

#--------使用方法 开始--------
# 1、将该脚本放在工程的根目录下(xcworkspace 或 xcodeproj 文件同级目录)或新建一个Shell文件夹下
# 2、请根据自己项目的情况选择使用 xcworkspace 还是 xcodeproj 形式,目前默认为 xcworkspace 形式
# 3、打开终端、执行脚本(输入 sh,将脚本文件拉倒终端,会生成文件路径,然后enter就可)
# 这个脚本主要介绍放在Shell文件夹下
#--------使用方法 结束--------
  • 项目自定义配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
echo "************************************"
echo "==========项目自定义配置 开始=========="
## 自定义好下列参数后再执行该脚本

# 工程Project名称
PROJECT_NAME="UBR"
# Scheme名
SCHEME_NAME="UBR"
# 打包编译的方式 Debug/Release,一般用Release
BUILD_CONFIGURATION="Debug"
# 打包的方式method:development/ad-hoc/app-store/nterprise
METHOD="ad-hoc"
# compileBitcode选项配置,默认YES,要设置成NO
COMPILEBITCODE="NO"
# SDK
SDK_NAME=iphoneos
# # 和method对应的mobileprovision文件名,手动管理时必填
# MOBILEPROVISION_NAME=""
# # 项目的bundleID,手动管理时必填
# BUNDLE_IDENTIFIER=""

echo "项目自定义配置 打印:"
echo "PROJECT_NAME=${PROJECT_NAME}"
echo "SCHEME_NAME=${SCHEME_NAME}"
echo "BUILD_CONFIGURATION=${BUILD_CONFIGURATION}"
echo "METHOD=${METHOD}"
echo "COMPILEBITCODE=${COMPILEBITCODE}"
echo "SDK_NAME=${SDK_NAME}"
# echo "MOBILEPROVISION_NAME=${MOBILEPROVISION_NAME}"
# echo "BUNDLE_IDENTIFIER=${BUNDLE_IDENTIFIER}"

echo "==========项目自定义配置 结束=========="

echo '//////////////////////////////////////////'
echo '//////////////////////////////////////////'
  • 项目固定参数配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
echo "==========项目固定参数配置 开始=========="
##无特殊情况不用修改

# 获取当前脚本所在的目录 $(cd `dirname $0`; pwd) ,脚本上一层目录 $(cd ..; pwd)
PROJECT_ROOT_PATH=$(cd ..; pwd)

# ExportOptions.plist 文件的存放路径,该文件描述了导出ipa文件所需要的配置
# 如果不知道如何配置该plist,可直接使用xcode打包ipa结果文件夹的 ExportOptions.plist 文件
# ExportOptions.plist 文件路径
EXPORTOPTIONS_PLIST_PATH=${PROJECT_ROOT_PATH}/ExportOptionsPlist/AdhocExportOptions.plist

# xcodeproject路径
PROJECT_PATH=${PROJECT_ROOT_PATH}/${PROJECT_NAME}.xcodeproj

# xcworkspace路径
WORKSPACE_PATH=${PROJECT_ROOT_PATH}/${PROJECT_NAME}.xcworkspace

echo "项目固定参数配置 打印:"
echo "PROJECT_ROOT_PATH=${PROJECT_ROOT_PATH}"
echo "EXPORTOPTIONSP_LIST_PATH=${EXPORTOPTIONS_PLIST_PATH}"
echo "PROJECT_PATH=${PROJECT_PATH}"
echo "WORKSPACE_PATH=${WORKSPACE_PATH}"

echo "==========项目固定参数配置 结束=========="

# echo '//////////////////////////////////////////'
# echo '//////////////////////////////////////////'
  • 项目版本号配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# echo "==========项目版本号配置  开始=========="
# # 获取当前版本号
# GET_BUILD_VERSION=`xcodebuild -showBuildSettings -target ${PROJECT_NAME} | grep CURRENT_PROJECT_VERSION | tr -d 'CURRENT_PROJECT_VERSION = '`
# # 当前版本号
# CURRENT_BUILD_VERSION=${GET_BUILD_VERSION}

# # 版本号增加 根据需求配置
# # agvtool new-version $((${OLD_BUILD_VERSION}+1))

# echo "项目版本号配置 打印:"
# echo "CURRENT_BUILD_VERSION=${CURRENT_BUILD_VERSION}"

# echo "==========项目版本号配置 结束=========="

echo '//////////////////////////////////////////'
echo '//////////////////////////////////////////'
  • IPA包路径配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
echo "==========IPA包路径配置 开始=========="
## IPA包
# 时间
DATE=`date '+%Y%m%d_%H%M%S'`
# IPA名称
EXPORT_IPA_NAME=iOS_${SCHEME_NAME}_${DATE}_${BUILD_CONFIGURATION}
# IPA文件夹路径
EXPORT_IPA_PATH=${PROJECT_ROOT_PATH}/IPA/${EXPORT_IPA_NAME}

# IPA归档文件路径
EXPORT_ARCHIVE_PATH=${EXPORT_IPA_PATH}/${SCHEME_NAME}.xcarchive

echo "IPA包路径配置 打印:"
echo "DATE=${DATE}"
echo "EXPORT_IPA_NAME=${EXPORT_IPA_NAME}"
echo "EXPORT_IPA_PATH=${EXPORT_IPA_PATH}"
echo "EXPORT_ARCHIVE_PATH=${EXPORT_ARCHIVE_PATH}"

# ${PROJECT_ROOT_PATH}:获取当前脚本目录,这个配置主要看脚本放在哪里
# 进入项目工程目录
cd ..
# IPA文件目录存在
if [ -d "${EXPORT_IPA_PATH}" ] ; then
echo "IPA文件路径已存在"
else # IPA文件目录不存在,则创建
mkdir -p ${EXPORT_IPA_PATH}
fi

echo "==========IPA包路径配置 结束=========="

echo '//////////////////////////////////////////'
echo '//////////////////////////////////////////'
  • 编译前清理工程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
echo "==========Build Clean Begin=========="
## 编译前清理工程

# project形式
# xcodebuild clean -project ${PROJECT_ROOT_PATH}/${PROJECT_NAME}.xcworkspace \
# -scheme ${SCHEME_NAME} \
# -configuration ${BUILD_CONFIGURATION} \
# -quiet || exit

# workspace
xcodebuild clean -workspace ${PROJECT_ROOT_PATH}/${PROJECT_NAME}.xcworkspace \
-scheme ${SCHEME_NAME} \
-configuration ${BUILD_CONFIGURATION} \
-quiet || exit

echo "==========Build Clean End=========="

echo '//////////////////////////////////////////'
echo '//////////////////////////////////////////'

  • 开始编译Archive工程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
echo "==========Build Archive Begin=========="
## 开始编译Archive工程

# 解锁钥匙串 -p 后面跟电脑密码 根据需要设置 XXX
security unlock-keychain -p "1127"

# project
# xcodebuild archive -project ${PROJECT_ROOT_PATH}/${PROJECT_NAME}.xcodeproj \
# -scheme ${SCHEME_NAME} \
# -configuration ${BUILD_CONFIGURATION} \
# -sdk ${SDK_NAME} \
# -archivePath ${EXPORT_ARCHIVE_PATH} \
# -quiet || exit

# workspace
xcodebuild archive -workspace ${PROJECT_ROOT_PATH}/${PROJECT_NAME}.xcworkspace \
-scheme ${SCHEME_NAME} \
-configuration ${BUILD_CONFIGURATION} \
-sdk ${SDK_NAME} \
-archivePath ${EXPORT_ARCHIVE_PATH} \
-quiet || exit

echo "==========Build Archive Success=========="

echo '//////////////////////////////////////////'
echo '//////////////////////////////////////////'
  • 删除 ExportOptions 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# echo "==========Delete ExportOptions Begin=========="
## 先删除ExportOptions文件
# if [ -f "${EXPORTOPTIONS_PLIST_PATH}" ] ; then
# rm -f ${EXPORTOPTIONS_PLIST_PATH}
# fi
# # 根据参数生成ExportOptions文件
# /usr/libexec/PlistBuddy -c "Add :compileBitcode bool ${COMPILEBITCODE}" ${EXPORTOPTIONS_PLIST_PATH}
# /usr/libexec/PlistBuddy -c "Add :method string ${METHOD}" ${EXPORTOPTIONS_PLIST_PATH}
# /usr/libexec/PlistBuddy -c "Add :provisioningProfiles:" ${EXPORTOPTIONS_PLIST_PATH}
# /usr/libexec/PlistBuddy -c "Add :provisioningProfiles:${BUNDLE_IDENTIFIER} string ${MOBILEPROVISION_NAME}" ${EXPORTOPTIONS_PLIST_PATH}

# echo "==========Delete ExportOptions End=========="

echo '//////////////////////////////////////////'
echo '//////////////////////////////////////////'
  • 导出ipa包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
echo "==========Export IPA Begin=========="
# 导出ipa包
xcodebuild -exportArchive \
-archivePath ${EXPORT_ARCHIVE_PATH} \
-exportPath ${EXPORT_IPA_PATH} \
-exportOptionsPlist ${EXPORTOPTIONS_PLIST_PATH} \
-quiet || exit

# 检查ipa包是否存在
if [ -e ${EXPORT_IPA_PATH}/${SCHEME_NAME}.ipa ]; then
echo "导出ipa包成功 😃 😃 😃"
# 打开IPA包的目录
open ${EXPORT_IPA_PATH}
else
echo "导出ipa包失败 😢 😢 😢"
fi
echo "==========Export IPA End=========="

echo '//////////////////////////////////////////'
echo '//////////////////////////////////////////'

echo "==========Delete Archive Start=========="
# 删除编译的.xcarchive文件,可根据各自情况选择是否保留
if [ -d "${EXPORT_ARCHIVE_PATH}" ]; then
rm -rf ${EXPORT_ARCHIVE_PATH}
echo "删除xcarchive文件夹成功 😃 😃 😃"
fi
echo "==========Delete Archive End=========="

echo '//////////////////////////////////////////'
echo '//////////////////////////////////////////'

  • 上传IPA到蒲公英
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# echo "============Upload Pgyer Begin============"
# ## 上传蒲公英 https://www.pgyer.com/doc/view/upload_one_command

# # {$filePath}是应用安装包文件的路径
# # {$uKey}是开发者的用户 Key,在应用管理-API中查看
# # {$apiKey}是开发者的 API Key,在应用管理-API中查看

# # U_KEY
# U_KEY="eb7e409601493709e587b1b30206e27b"
# # API_KEY
# API_KEY="26f45bbd98549c89a14753329e234372"
# # 上传到蒲公英
# if [ -e "${EXPORT_IPA_PATH}/${SCHEME_NAME}.ipa" ]; then
# echo "开始上传ipa到蒲公英"
# curl -F "file=@${EXPORT_IPA_PATH}/${SCHEME_NAME}.ipa" \
# -F "uKey=4a5bc52e6763795e18b69bd82dd23a9e" \
# -F "_api_key=${API_KEY}" \
# "https://www.pgyer.com/apiv1/app/upload"
# echo "上传ipa到蒲公英成功"
# else
# echo "上传ipa到蒲公英失败"
# fi

# echo "============Upload Pgyer End============"

echo '//////////////////////////////////////////'
echo '//////////////////////////////////////////'
  • 上传到App Store
1
2
3
4
5
6
7
8
9
10
11
# echo "============Uploading App Store Begin============"
# 上传App Store
# ALTOOL_PATH="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"

# 将-u 后面的XXX替换成自己的AppID账号,-p后面的XXX替换成自己的密码
# "$ALTOOL_PATH" --validate-app -f ${EXPORT_IPA_PATH}/${SCHEME_NAME}.ipa -u 13718004742@163.com -p ZJzj5425541 -t ios --output-format xml
# "$ALTOOL_PATH" --upload-app -f ${EXPORT_IPA_PATH}/${SCHEME_NAME}.ipa -u 13718004742@163.com -p ZJzj5425541 -t ios --output-format xml

# echo "============Uploading App Store End============"

exit 0

注:
上面的一些配置可用可不用,具体根据项目和需求去添加

  • Post title:Xcode学习04:Shell自动化脚本打IPA包
  • Post author:张建
  • Create time:2023-05-01 21:46:19
  • Post link:https://redefine.ohevan.com/2023/05/01/Xcode/Xcode学习04:Shell自动化脚本打IPA包/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
On this page
Xcode学习04:Shell自动化脚本打IPA包