自动化流程完成打包 IPA 到 上传 AppStore(部分)
自动化流程完成 打包 IPA 到 上传 AppStore 需要哪几部呢?
第一步: 证书生成、导入
第二步: App 创建、填写相关信息,上传相关文件
第三步: 自动化打包 IPA
第四步: 自动化重签名
第五步: 自动化上传 App Store
第四步的部分在这里 自动化重签名 (重签名踩坑)
本篇文章目前实现
第五步 上传 App 到 AppStore
当你有了 *.app 之后 你要怎么上传到苹果后台呢?
第一步、创建 *.itmsp 其实就是一个文件夹
第二步、在*.itmsp 中创建 *.metadata 文件 其实是一个 xml文件。内容如下 其中
__APPID__,__FILESIZE__,__FILENAME__,__MD5SIGN__ 分别对应包的应用id(注意是苹果的一串数字id不是BundleId),Ipa包的大小,Ipa包的文件名,Ipa包的md5签名.
XML 文件内容
<?xml version="1.0" encoding="UTF-8"?> <package xmlns="http://apple.com/itunes/importer" version="software5.4"> <software_assets apple_id="__APPID__" app_platform="ios"> <asset type="bundle"> <data_file> <size>__FILESIZE__</size> <file_name>__FILENAME__</file_name> <checksum type="md5">__MD5SIGN__</checksum> </data_file> </asset> </software_assets> </package>
第三步、拷贝 *.ipa 到 *.itmsp 中.名字要与xml中的名字对应
第四步、 上传
xcrun iTMSTransporter -m upload -u $USERNAME -p $PASSWORD -f ${IPAppath}/$itmspDir -t "DAV,Signiant" -k 100000 2>&1
可能你 一个应用下 有多个证书,那么你还要指定证书
-itc_provider $PRO_NAME 其中 $PRO_NAME 你可以通过 security cms -D -i embedded.mobileprovision > plistfile PRO_NAME=`/usr/libexec/PlistBuddy -c \'Print :TeamName\' plistfile` 获得。
我的参考:
#!/bin/bash # set -x run_path=$(cd `dirname $0`; pwd) cd $run_path XMLTemplate=$run_path/XMLTemplate.xml #就是上面的xml文件 IPApath=$1 APPID=$2 USERNAME=$3 PASSWORD=$4 IPAppath=${IPApath%/*} PROXY="" #批量上传最好用代理 GAMENAME="" if [ -z $USERNAME ]; then pushd $IPAppath if [ ! -d $IPAppath/upload ]; then confzip=`ls *_config.zip` if [ ! -z $confzip ]; then unzip -oq $confzip -d upload fi fi pushd $IPAppath/upload USERNAME=`cat gameinfo.txt| grep username` USERNAME=${USERNAME##*\=} PASSWORD=`cat gameinfo.txt| grep password` PASSWORD=${PASSWORD##*\=} if [ -z $APPID ]; then APPID=`cat gameinfo.txt| grep appId` APPID=${APPID##*\=} fi PROXY=`cat gameinfo.txt| grep proxyaddr` PROXY=${PROXY##*\=} GAMENAME=`cat setting.sh| grep GameName` GAMENAME=${GAMENAME##*\=} popd popd fi if [ -z $APPID ]; then echo $GAMENAME echo "这个游戏没有找到appId!!! " >> UploadResult.txt echo "这个游戏没有找到appId!!! " >> ${IPAppath}/UploadResult.txt exit 1; fi function get_char() { SAVEDSTTY=`stty -g` stty -echo stty cbreak dd if=/dev/tty bs=1 count=1 2> /dev/null stty -raw stty echo stty $SAVEDSTTY } function pause() { if [ x"$1" != x"" ]; then echo $1 fi char=`get_char` } # PROXY="" if [ -z "$PROXY" ]; then echo $GAMENAME" 该游戏没有获取到 代理 线路!" exit 1; else echo $PROXY echo "请切换代理,然后按任意键继续!!!" fi pause # exit 1; MD5sign=$(md5 $IPApath | awk \'{print $4}\') FILEsize=$(ls -l $IPApath | awk \'{print $5}\') IPAname=$(openssl rand -base64 64 | tr -cd \'a-zA-Z\' |head -c 6).ipa itmspDir=$(openssl rand -base64 64 | tr -cd \'a-zA-Z\' |head -c 4).itmsp xmlF=${IPAppath}/$itmspDir/metadata.xml if [ -d ${IPAppath}/$itmspDir ]; then rm -rf ${IPAppath}/$itmspDir fi mkdir ${IPAppath}/$itmspDir # echo -e $XMLTemplate > $xmlF # exit 1; cp $XMLTemplate $xmlF sed -i "" "s/__APPID__/$APPID/" $xmlF sed -i "" "s/__MD5SIGN__/$MD5sign/" $xmlF sed -i "" "s/__FILESIZE__/$FILEsize/" $xmlF sed -i "" "s/__FILENAME__/$IPAname/" $xmlF cp -Xr $IPApath ${IPAppath}/$itmspDir/$IPAname # exit 1; # xcrun iTMSTransporter -m upload -u $USERNAME -p $PASSWORD -f /Users/lestenlee/Documents/work/AutoBuildOutput/output20200703/20200703-221949/1521965964.itmsp -t "DAV,Signiant" -k 100000 -itc_provider 428RW85NQM 2>&1 echo "开始上传游戏 => "$GAMENAME xcrun iTMSTransporter -m upload -u $USERNAME -p $PASSWORD -f ${IPAppath}/$itmspDir -t "DAV,Signiant" -k 100000 2>&1 upload_ret=$? echo $GAMENAME" 上传结果 => "$upload_ret echo $GAMENAME" 上传结果 => "$upload_ret >> UploadResult.txt echo "上传结果 => "$upload_ret >> ${IPAppath}/UploadResult.txt
批量上传:
#!/bin/bash run_path=$(cd `dirname $0`; pwd) cd $run_path chmod u+x $run_path/autoUpload.sh for file in $run_path/output/* do if ! test -f $file; then pushd $file ipaf=`ls $file/*resigned.ipa` if [ ! -z $ipaf ]; then $run_path/autoUpload.sh $ipaf fi popd fi done
记录下上传 AppStore 的问题
在xcode11之后, 使用 altool 上传就不行了 可能是我 方式有问题 尝试了很多次始终 卡死状态。 所以以上我用的 xcrun 带的工具 Xcode 11 里面的
altool --upload-app -f ipa的存放路径 -t 平台(ios) -u 开发者账号 -p 开发者账号对应的密码
在xcode11之前
/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool
在xcode11之后
/Applications/Xcode.app/Contents/SharedFrameworks/ContentDeliveryServices.framework/Versions/A/Frameworks/AppStoreService.framework/Versions/A/Support/altool