ios 打包步骤相对于 Android 来说稍显麻烦,先看一下在 Xcode 上打包的流程:
Xcode 打包步骤
1、打开 Product -> Scheme -> Edit Scheme,选择 Archive 的 Build Configuration 为 Debug 或者 Release:
2、点击 Product -> Archive 开始归档,归档完成后选择分发应用,然后选择分发的方式、签名、是否压缩等,选择完成后开始处理分发前的归档包:
3、归档包预处理完成后选择路径,导出最终的 ipa 包相关文件:
可以说整个流程步骤比较繁琐,所以打包流程如果能够通过脚本来一步到位实现将会节省很多的功夫,因此特意呈上一份比较完整的 ios ipa 打包 shell 脚本!
脚本打包步骤
首先配置一些常量
# 常量配置
APP_NAME="{目标名称}" #e.g."DemoApp"
EXPORT_PLIST="Export.plist"
PACKAGE_NAME="autoPackage"
CONFIGURATION="Debug"
METHOD="development"
WORK_SPACE="{workspace工程文件}" #e.g."DemoApp.xcworkspace"
PROJECT="{项目工程文件}" #e.g."DemoApp.xcodeproj"
脚本打包是依靠 xcodebuild 命令实现的,主要的命令行有三条,实现了 Xcode 打包的各个步骤:
1、Clean
xcodebuild clean -workspace ${WORK_SPACE}\
-scheme ${APP_NAME}\
-configuration ${CONFIGURATION}
# 如果无workspace,可将此命令中 "-workspace ${WORK_SPACE}" 替换为 "-project ${PROJECT}"
# CONFIGURATION 参数可选择: Debug,Release
2、Archive
ARCHIVE_PATH="./${PACKAGE_NAME}/${APP_NAME}.xcarchive"
xcodebuild archive -workspace ${WORK_SPACE}\
-scheme ${APP_NAME}\
-configuration ${CONFIGURATION}\
-archivePath ${ARCHIVE_PATH}
# 如果无workspace,可将此命令中 "-workspace ${WORK_SPACE}" 替换为 "-project ${PROJECT}"
3、Export
# 替换Export.plist中的export方法为指定的方法,METHOD 参数可选择:development,adhoc,app-store,enterprise
sed -i '' "s/{method}/${METHOD}/g" ${EXPORT_PLIST}
EXPORT_PATH="./${PACKAGE_NAME}/${APP_NAME}"
xcodebuild -exportArchive\
-exportOptionsPlist ${EXPORT_PLIST}\
-archivePath ${ARCHIVE_PATH}\
-exportPath ${EXPORT_PATH}\
-allowProvisioningUpdates
其中 EXPORT_PLIST 对应的是一个必须的 plist 文件,该文件包含了分发的方式、签名、是否压缩等信息,因此需要在当前目录里新建一个 Export.plist 文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!--{}内为需要手动替换字段,{method}除外-->
<!--是否编译二进制码-->
<key>compileBitcode</key>
<false/>
<key>destination</key>
<string>export</string>
<!--此处{method}不需要手动替换,由脚本传入参数自动替换-->
<key>method</key>
<string>{method}</string>
<!--签名方式 >> 自动-->
<key>signingStyle</key>
<string>automatic</string>
<!--签名方式 >> 手动-->
<!--<key>signingStyle</key>-->
<!--<string>manual</string>-->
<!--<key>provisioningProfiles</key>-->
<!--<dict>-->
<!--<key>{项目的bundleId}</key>-->
<!--<string>{证书名称}</string>-->
<!--</dict>-->
<key>stripSwiftSymbols</key>
<true/>
<key>teamID</key>
<string>{teamID}</string>
<key>thinning</key>
<string><none></string>
</dict>
</plist>
打包脚本补充
以上就是用 shell 脚本打包的主要命令行内容了,为了拓展脚本的易用性,完整脚本内容会有以下几点补充:
- 增加 configuration、method 两个参数的传入
- 从项目的 info.plist 文件中截取应用的版本名、版本号来重命名文件以作版本区分
- 复制生成的 ipa 文件路径到粘贴板,以便后续上传等操作
- 统计打包脚本运行时长
下面附上打包脚本完整内容:
#!/bin/bash
# 此脚本为ios ipa打包脚本,在当前项目目录下调用,请确保当前目录下包含Export.plist文件
# 脚本具体使用方式请参考 ./ipa_build_template -help
# 脚本执行的内容:clean -> archive -> export
# create by wuzhiqiang 14/2/2019
START_TIME=`date +%s`
# 常量配置
APP_NAME="{目标名称}" # e.g."DemoApp"
INFO_PLIST="{info.plist文件路径}" #e.g."./Supporting Files/Info.plist"
EXPORT_PLIST="Export.plist"
PACKAGE_NAME="autoPackage"
CONFIGURATION="Debug"
METHOD="development"
WORK_SPACE="{workspace工程文件}" #e.g."DemoApp.xcworkspace"
#PROJECT="{项目工程文件}" #e.g."DemoApp.xcodeproj"
# 使用方式说明
if [[ -n "$1" ]] && [[ "$1" == "-help" ]] ; then
echo "使用方式:"
echo "$0 <configuration> <method>"
echo
echo "configuration 可接收参数(不传默认值为-r):"
echo " -d build configuration: Debug"
echo " -r build configuration: Release"
echo
echo "method 可接收参数(不传默认值为dev):"
echo " dev distribution method:development"
echo " adhoc distribution method:adhoc"
echo " as distribution method:app-store"
echo " ent distribution method:enterprise"
exit
fi
# 处理输入参数,只识别-d, -r, dev, adhoc, as, ent 参数
# 打包配置和export方法均可传参或者不传参(使用默认值 CONFIGURATION="Debug",METHOD="development")。
while [[ -n "$1" ]]
do
case $1 in
-d) CONFIGURATION="Debug" ;;
-r) CONFIGURATION="Release" ;;
dev) METHOD="development" ;;
adhoc) METHOD="adhoc" ;;
as) METHOD="app-store" ;;
ent) METHOD="enterprise" ;;
*) echo "error: Unknown args '$1'."
exit ;;
esac
shift
done
if [[ ! -d ${PACKAGE_NAME} ]] ; then
mkdir ${PACKAGE_NAME}
fi
echo "clean..."
# 如果无workspace,可将此命令中 "-workspace ${WORK_SPACE}" 替换为 "-project ${PROJECT}"
xcodebuild clean -workspace ${WORK_SPACE}\
-scheme ${APP_NAME}\
-configuration ${CONFIGURATION}
# 从info.plist文件中获取版本名、版本号用来重命名生成的ipa包
VERSION_NAME=$(awk '/CFBundleShortVersionString/{getline; print}' "${INFO_PLIST}")
VERSION_NAME=${VERSION_NAME#*"<string>"}
VERSION_NAME=${VERSION_NAME%"</string>"*}
VERSION_CODE=$(awk '/CFBundleVersion/{getline; print}' "${INFO_PLIST}")
VERSION_CODE=${VERSION_CODE#*"<string>"}
VERSION_CODE=${VERSION_CODE%"</string>"*}
DIR_NAME="v${VERSION_NAME}(${VERSION_CODE})"
FULL_NAME="${APP_NAME}-v${VERSION_NAME}(${VERSION_CODE})"
echo "archive..."
ARCHIVE_PATH="./${PACKAGE_NAME}/${FULL_NAME}.xcarchive"
# 如果无workspace,可将此命令中 "-workspace ${WORK_SPACE}" 替换为 "-project ${PROJECT}"
xcodebuild archive -workspace ${WORK_SPACE}\
-scheme ${APP_NAME}\
-configuration ${CONFIGURATION}\
-archivePath ${ARCHIVE_PATH}
echo "export ${METHOD}..."
EXPORT_PATH="./${PACKAGE_NAME}/${DIR_NAME}"
# 替换文件中的export方法为指定的方法
sed -i '' "s/{method}/${METHOD}/g" ${EXPORT_PLIST}
xcodebuild -exportArchive\
-exportOptionsPlist ${EXPORT_PLIST}\
-archivePath ${ARCHIVE_PATH}\
-exportPath ${EXPORT_PATH}\
-allowProvisioningUpdates
IPA_PATH="${EXPORT_PATH}/${APP_NAME}.ipa"
NEW_IPA_PATH="${EXPORT_PATH}/${FULL_NAME}.ipa"
if [[ -f ${IPA_PATH} ]] ; then
mv ${IPA_PATH} ${NEW_IPA_PATH}
echo "========================================================="
echo "\"${NEW_IPA_PATH}\""
echo "========================================================="
# 复制ipa文件路径到粘贴板,以便后续上传等操作
echo "\"${NEW_IPA_PATH}\"" | pbcopy
else
echo "export failed"
fi
# 替换文件中的export方法回默认值,以便下一次使用
sed -i '' "s/${METHOD}/{method}/g" ${EXPORT_PLIST}
# 删除archive过程中生成的.xcarchive文件
rm -rf ${ARCHIVE_PATH}
# 计算此次用时时长
END_TIME=`date +%s`
echo "本次运行共计时:"$((END_TIME - START_TIME))"s"
想要下载完整文件,请移步到 Github,欢迎 star
本文为个人原创,转载请注明出处。