on-demand 资源下发

Apple On-Demand Resource

Xcode 可以给资源打 tag,被打 tag 的资源在打包时不会打到包内。需要时下载,测试时可以使用自己的服务器,但是发布到 AppStore 时需要托管到苹果的服务器。
苹果的 On-Demand Resource 文档

自建资源下发模块

了解到了苹果 On-Demand Resource 机制,我们可以结合Resource Tags 下的资源不会打包到 ipa 包的特性。设计一套自己的下发机制。

自动打包上传

给需要下发的资源打上 tag 标签,xcode 打包时运行脚本上传 tag 包,生成 tag 配置信息 plist 文件,打包完成手动检查 md5 的一致性。

按需下载模块设计

接口和使用参照了苹果的 ondemand 相关接口

上面其实是第一版…. 中间面临新的需求,比如需要保持一个下载进度,让 download view 能随时取到。

自动生成 plist

使用自带的 PlistBuddy 命令可以把 plist 更新
PlistBuddy参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
echo "start on-demand resource module"
GTagRootPath='./On-DemandResources' //放 tag 资源包的路径,这里面我放的是已经打包好了 zip包,并标记为 tag resource
echo On-DemandResources path = $GTagRootPath
GTagPlistPath='./yourconfig.plist' //plist 路径,先生成一个在工程里
echo plist path = ${GTagPlistPath}
GVerion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
echo version = ${GVerion}
GbundleId=${PRODUCT_BUNDLE_IDENTIFIER}
echo bundleID = ${GbundleId}

/usr/libexec/PlistBuddy -c "Set :bundleID $GbundleId" $GTagPlistPath
/usr/libexec/PlistBuddy -c "Set :version $GVerion" $GTagPlistPath
/usr/libexec/PlistBuddy -c "Delete :tags" $GTagPlistPath
/usr/libexec/PlistBuddy -c "Add :tags array" $GTagPlistPath

index=0
for file in $GTagRootPath/*
do
if test -f $file
then
echo $file 是文件
md5String=$(md5 -q $file)
name=$(basename $file .zip)
size=$(ls -l $file | awk '{print $5}')
echo size is $size
/usr/libexec/PlistBuddy -c 'Add :tags: dict' test.plist
/usr/libexec/PlistBuddy -c "Add :tags:$index:name string $name" $GTagPlistPath
/usr/libexec/PlistBuddy -c "Add :tags:$index:size integer $size" $GTagPlistPath
echo $md5String
/usr/libexec/PlistBuddy -c "Add :tags:$index:md5 string $md5String" $GTagPlistPath
index=$((index+1))
fi
if test -d $file
then
echo $file 是目录
fi
done

check 和 上传脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
echo "start ondemand resource archive ......"
# check resource getInfo
echo start get resource info
curl -X POST \
http://your.com/xxx \
-H 'Postman-Token: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
-F version=1.0.0 \
-F 'tagNames=["test"]'

curl -X POST \
http://your.com/xxxx \
-H 'Content-Type:multipart/form-data; boundary=----ioqwiokjlfdlk198kdskl8oiidfn9mfdjmji9fd' \
-F version=1.0.0.10 \
-F tagName=test \
-F data=@/Users/xxx/test.zip

echo "end ondemand resource archive ......"