APP 多发的自动化打包方案

2016/6/8 23:5 下午 posted in  iOS comments

最近项目为了尝试一些危险的推广方案和防止App Store下架风险,在不同的帐号下发布了相同的应用。我在这里面做了一套自动化打不同应用的方案,加快发布应用流程。

传统方法

以前,为了做到相同的应用多发,我们在原来的工程里,复制一份Target,然后修改bundle id、icon等信息。然后打包发布。
这个方法的好处是开始很简单,任何人都能解决,但缺点也很明显:

  1. 在 APP 的改进演化过程中,我们新加入文件的时候必须要选上每个Target;
  2. 在发布的时候,需要手动选择每个Target、改证书、打包、上传、登录网站提交审核;

这些步骤很花时间,特别是新加文件这个问题很容忘记,导致打包失败。为了解决这个问题,于是有了下面一整套自动化解决方案

自动化方案简介

此方案的基本原则是首先工程里只需要有一个Target,其次是自动化修改必要文件,然后打包。
为了做到这些,用到了两个工具:

  1. Bash script: 修改bundle id、icon、证书、各种keys;
  2. 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 需要改些地方适合你的工程,不能直接使用。大家可以直接复制过去修改一下。这里面我填了很多坑,避免大家再来一遍。