zoukankan      html  css  js  c++  java
  • 自动化流程完成打包 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

      

  • 相关阅读:
    关于Vue修改默认的build文件存放的dist路径
    JSON.stringify的三个参数(转载)
    JS获取字符串实际长度(包含汉字)的简单方法
    JSON.stringify() 和 JSON.parse()
    iPhone各种机型尺寸、屏幕分辨率
    jquery each 遍历
    React 內联式样
    组件Refs(操作DOM的2⃣️两种方法)
    可复用组件
    事件与数据的双向绑定
  • 原文地址:https://www.cnblogs.com/lesten/p/13267613.html
Copyright © 2011-2022 走看看