iOS渠道包相关
2019-01-07 本文已影响10人
蚂蚁牙齿不黑
一、渠道包应用场景:
打包完一个母包.ipa 后,各个渠道商可能会使用到不同的域名,icon 等等,所以各个渠道商就需要拿到他们专属的ipa去进行推广,如果针对每个渠道商都去修改代码单独打包,这样做有些费力,而且来回切换容易出错
二、解决办法:
修改ipa文件中指定的文件内容来区分不同的渠道,而ipa文件如果被修改了就需要重新签名,不然用户无法安装,总结来说就是两个步骤
- 修改ipa文件
- 重新签名
三、IPA文件目录结构
3.1使用解压缩命令“unzip”解压缩当前文件夹的ipa 文件可以得到一个Payload文件夹,里面又一个.app文件,点击右键显示包内容可以看到ipa中的内容
image.png3.2 观察ipa 文件目录结构不难发现文件大致可分为3类
- 项目中所用到的资源文件
- _CodeSignature文件夹(签名文件)
- embedded.mobileprovision (证书配置文件)
四、修改ipa 中指定的文件并重新签名
4.1 准备工作
image.png如上图我在打包ipa 通过xcode 在工程中预留了一个名为“DChannel”的plist文件,是一个字典格式的数据,其中只有一个字段“Channel”用于存放各个子包的渠道标示
准备好一个名为Entitlements的plist文件
image.png
4.2 通过脚本实现两步 修改文件和重新签名
# 输入的包名
name=$1
# $1 就是传进来的第一个参数 $2就是第二个参数
#echo 是打印的意思
echo "---ahh---"
echo ${name}
appName="${name}.app"
echo ${appName}
plistBuddy="/usr/libexec/PlistBuddy"
#configName="channel.plist"
configName="Payload/${appName}/DChannel.plist"
configNameNew="Payload"
ipa="${name}.ipa"
# 打好包后输出的文件夹名字
outUpdateAppDir="OutApps"
# 获取当前目录,并切换过去
currDir=${PWD}
echo ${currDir}
cd "${currDir}"
echo "-----${currDir}"
# 生成日志目录
#mkdir log
rm -rf Payload
#解压缩
unzip -o -q ${ipa} #>> log/unzipUpdateApp.log
#echo `ls Payload`
# 删除旧的文件,重新生成
rm -rf "${outUpdateAppDir}"
mkdir "${outUpdateAppDir}"
echo "------------------------开始打包程序------------------------"
#echo ""
# 渠道列表文件开始打包
#for line in $(cat TargetChanelList.txt)
#循环数组,批量打包时需要修改的渠道号和渠道Id ("1174" "1173")
# 这里的参数可以从外面直接传过来,
ChannelID=("111" "222" "333")
echo ${#ChannelID[@]}
for ((i=0;i<${#ChannelID[@]};i++))
do
#echo是输出命令,可以忽略
echo "........正在打包渠道号:${ChannelID[$i]}"
# cd Payload/${appName}
# 设置Channel.plist
echo "-----1----${PWD}"
#修改
$plistBuddy -c "set :Channel ${ChannelID[$i]}" ${configName}
echo "-----2----${PWD}"
rm -rf Payload/${appName}/_CodeSignature
# ipa包签名: codesign -f -s "iPhone Distribution: Distribution证书名字,打开钥匙串可以看到" --entitlements "Entitlements.plist" "Payload/${appName}"
codesign -f -s "iPhone Distribution: SEEKTOP SERVICE MANAGEMENT INC." --entitlements entitlements.plist Payload/${appName}
#Payload/Demo.app: replacing existing signature :这个时候是已经OK
zip -rq "${outUpdateAppDir}/${ChannelID[$i]}.ipa" "Payload"
echo "........打包已完成"
done
echo "------------------------程序打包已结束------------------------"
五、开始打包
在执行shell脚本打包前,你准备好的文件应该有4个,如下图
image.png
打开终端进入到当前渠道包这个文件夹 执行 脚本 “aibet”为ipa 的名字
sh ChannelPackage.sh aibet
执行完成后,最终会看到渠道包这个文件夹里多出了一个OutApps的文件夹,其中有3个ipa 就是分别贝标示为"111" "222" "333"的子包,为了检测效果,你可以进入到这3个子包的内容区看看他们的DChannel.plist中的Channel字段的值是否已经修改了
image.png