最近项目为了尝试一些危险的推广方案和防止App Store下架风险,在不同的帐号下发布了相同的应用。我在这里面做了一套自动化打不同应用的方案,加快发布应用流程。
传统方法
以前,为了做到相同的应用多发,我们在原来的工程里,复制一份Target,然后修改bundle id、icon等信息。然后打包发布。
这个方法的好处是开始很简单,任何人都能解决,但缺点也很明显:
- 在 APP 的改进演化过程中,我们新加入文件的时候必须要选上每个Target;
- 在发布的时候,需要手动选择每个Target、改证书、打包、上传、登录网站提交审核;
这些步骤很花时间,特别是新加文件这个问题很容忘记,导致打包失败。为了解决这个问题,于是有了下面一整套自动化解决方案
自动化方案简介
此方案的基本原则是首先工程里只需要有一个Target,其次是自动化修改必要文件,然后打包。
为了做到这些,用到了两个工具:
- Bash script: 修改bundle id、icon、证书、各种keys;
- fastlane: 打包、上传、提交审核;
先说Bash,这就是简单 sed
替换。这里需要提高一个工具 PlistBuddy
,这个是Mac自带的命令行修改pist文件超好用工具,特别傻瓜。
fastlane是一套开源的 iOS 和 Android 打包工具包。它干嘛?在 itunesconnect 和 developer站点自动创建应用和证书,上传、打包、更新应用信息和提交审核。很强吧!有一点需要注意:它的工具组件之间是相互独立的,工具之间配合是靠环境变量来沟通,这点很坑。想要灵活衔接,就需要脚本了。
方案说明
在我的工程里,有一个 release.sh
,这个就是脚本。还有很多 *.conf
的文件是应用相关信息。我就顺着 release.sh
的内容说下原理。
保存每个应用不同的内容到配置文件
首先我们先讲需要修改的点保存到配置文件里。我的项目里是 *.conf
。
app_name='' #填入自己的内容
app_bundle_id=''
app_product_name=''
app_scheme=''
app_icon_path=''
qq_id=''
weibo_key=''
获取最新证书
这里用到 fastlane 里的 match 工具,他可以一个自动管理证书和 provisioning profile。
match --git_branch ${apple_id} -y appstore -a ${app_bundle_id} -u ${apple_id} -r ${YOUR_CERTIFICATES_REPO}
读取 *.conf
文件,修改工程
这里除了要修改bundle id、icon、keys,记得还要修改 provisioning profile 到 distribution的。这里修改 provisioning profile 时,我用到了 match 设置的环境变量,这是为了避免去找 profile 的 udid。
#sample
echo "changing ga key to: ${ga_key}"
sed -i '' "s/${OLD_GA_KEY}/${ga_key}/" $appDelegate_file
echo "set app version string:${app_version_string}"
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString ${app_version_string}" $info_fi
gym 打包生成 ipa
这个没什么,一个命令搞定。
gym --scheme "${YOUR_TARGET_SCHEME}" --clean true --configuration "Release" --output_directory ${ipa_path} --use_legacy_build_api true --output_name $ipa_name --include_symbols true
deliver 上传、发布;
deliver除了上传外,还能修改应用的所有 metadata 信息,并提交。metadata按照指定文件格式放好就行。提交的话,因为需要一些参数,这个我先自动生成配置文件,然后再用deliver,最后删掉。
echo ">> create Deliverfile"
echo "submission_information({
add_id_info_uses_idfa:true,
add_id_info_serves_ads:true,
add_id_info_limits_tracking:true,
export_compliance_uses_encryption:false,
export_compliance_encryption_updated:false})" > Deliverfile
echo ">> deliver ipa"
deliver -u ${apple_id} -a ${app_bundle_id} -i ${ipa_path}${ipa_name}.ipa -z ${app_version_string} --submit_for_review -f
恢复到最初,打包下一个
这里,我在开始修改文件前都复制了一份备份文件,这时候就是还原场景,避免干扰下一次打包。
cp ${info_file}.bp $info_file
rm ${info_file}.bp
...
以上是大概内容。可以到这里看我的 release.sh demo,这个 demo 需要改些地方适合你的工程,不能直接使用。大家可以直接复制过去修改一下。这里面我填了很多坑,避免大家再来一遍。