xcodebuilder 自动打包

脚本打包步骤

首先配置一些常量
#常量配置
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="./ P A C K A G E N A M E / {PACKAGE_NAME}/ PACKAGENAME/{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” E X P O R T P L I S T E X P O R T P A T H = " . / {EXPORT_PLIST} EXPORT_PATH="./ EXPORTPLISTEXPORTPATH="./{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"?>
<!--是否编译二进制码-->
<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>&lt;none&gt;</string>

打包脚本补充

以上就是用 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"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Macle_Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值