美文网首页
分利宝iOS自动化打包之旅

分利宝iOS自动化打包之旅

作者: Sang6001 | 来源:发表于2019-05-23 11:18 被阅读0次

    前言

    在iOS开发中,我们常用的打包上传方式就是用Xcode的archive方式打包。到了测试阶段,需要频繁的打包提交到测试平台,整个流程包括:编译-打包-上传,整个过程需要我们去坚守每一步操作,提交app store同样免不了一系列复杂动手操作过程。对此,我们研究了iOS自动化打包,通过使用shell脚本,输入命令,一键打包上传,提高工作效率。
    在讲自动化打包之前,我们先看下我们传统的打包方式:

    第一种打包方式:传统打包方式(archive方式)

    就是我们的传统打包方式——利用Xcode进行archive(归档)操作,通过编译、build构建、Archive存档、Export导出ipa。

    打包前准备工作:
    设置好对应版本号,证书正确配置,或使用自动管理证书,然后选择通用设备;
    开始进行achive归档打包:点击左上角product——>achive:如下图:


    archive

    通过编译归档之后生成archive文件,再点击右侧的distribute App,如下图:



    然后选择打包环境,如下图,第1种: 生产环境,上传到appStore的;第2种: 测试环境的上传到蒲公英或fir上的;第3种:用于企业账号发布;第4种: 开发调试用的,debug模式会输出日志信息。开发测试一般用第2种或第4种。 选择对应环境

    按提示点击next下一步操作,最后export导出来,会生成一个文件夹,里面装了ipa包,就是我们需要上传ipa包。通过xcode自带的插件工具Application Locader(通过右击Xcode图标选择Open Developer Tool)选择ipa包上传就行了。

    第二种打包方式:也可以通过生成文件Payload文件夹,生成ipa包。

    操作步骤:

    打包前准备:同样要相关证书的配置,编译能通过不报错。
    选择要编译的Shcheme,然后command+B编译成功,在products文件夹里可以看到由之前的红色变成了黑色如下图:上图(编译前),下图(编译后)


    编译前
    编译后

    右键编译后的Projudct,show in Finder里面找到这个app如下图:



    在桌面建一个文件夹叫“Payload”,注意一个字母也不能改,然后把这个app放入这个文件夹里,压缩成zip,再修改后缀为.ipa。
    上传操作同第一种方式一样。

    自动化打包上传

    打包原理:

    主要是通过shell脚本实现archive->生成ipa->上传到第三方平台(Fir.im 、蒲公英)或 App store这一系列过程的自动化。

    准备工作:安装fir-cli插件

    打开终端输入sudo gem install fir-cli,如下图,这里输入命令安装的时候要注意下权限问题。

    // 安装指令
    gem sudo install fir-cli
    

    对于没有安装过rvm的,需要安装rvm(一个命令行工具,可以提供一个便捷的多版本 Ruby 环境的管理和切换)

    安装rvm,网上有大把的教程。

    相关环境配置、shell脚本编写

    根据需求,我这里做了3种环境配置,appStore、ad-hoc、development三种环境plist文件添加和设置,如下图



    用xcode创建这三份plist文件放在当前工程目录里。这里制作了一份通用shell脚本(以fir和appStore为例):

    #先清理目录(由于历史编译存留的文件)
    if [ -d ./ipaDir ];
    then
    rm -rf ./ipaDir
    fi
    if [ -d ./build ];
    then
    rm -rf ./build
    fi
    #ipa包存放路径
    if [ ! -d ./ipaDir ];
    then
    mkdir -p ipaDir;
    fi
    #脚本执行目录/工程绝对路径
    project_path=$(cd `dirname $0`; pwd)
    #工程名 将XXX替换成自己的工程名
    project_name=XXX
    #scheme名 将XXX替换成自己的sheme名
    scheme_name=XXX
    #打包模式 Debug/Release
    development_mode=Debug
    #build文件夹路径
    build_path=${project_path}/build
    #plist文件所在路径
    exportOptionsPlistPath=${project_path}/exportTest.plist
    #导出.ipa文件所在路径
    exportIpaPath=${project_path}/ipaDir/${development_mode}
    #输入1:appStore(发布)  2:ad-hoc(开发-测试) 3:dev(开发-测试)
    echo "Place enter the number you want to export ? [ 1:app-store 2:ad-hoc 3:dev] "
    read number
    while([[ $number != 1 ]] && [[ $number != 2 ]] && [[ $number != 3 ]])
    do
    echo "Error! Should enter 1 or 2 or 3"
    echo "Place enter the number you want to export ? [ 1:app-store 2:ad-hoc 3:dev] "
    read number
    done
    #appStore
    if [ $number == 1 ];then
    development_mode=Release
    exportOptionsPlistPath=${project_path}/exportAppstore.plist
    exportIpaPath=${project_path}/ipaDir/${development_mode}
    #ad-hoc
    elif [ $number == 2 ];then
    development_mode=Release
    exportOptionsPlistPath=${project_path}/exportTest.plist
    #dev
    else
    scheme_name=fenlibao_iphone_DEV
    development_mode=Debug
    exportOptionsPlistPath=${project_path}/exportTest_DEV.plist
    fi
    
    echo '/// 正在编译工程:'${development_mode}
    echo '///-----------'
    #如果工程不是.xcworkspace类型而是.xcodeproj类型,则下面的.xcworkspace换成.xcodeproj
    xcodebuild \
    archive -workspace ${project_path}/${project_name}.xcworkspace \
    -scheme ${scheme_name} \
    -configuration ${development_mode} \
    -archivePath ${build_path}/${project_name}.xcarchive  -quiet  || exit
    echo '///--------'
    echo '/// 打包中...'
    echo '///--------'
    xcodebuild -exportArchive -archivePath ${build_path}/${project_name}.xcarchive \
    -configuration ${development_mode} \
    -exportPath ${exportIpaPath} \
    -exportOptionsPlist ${exportOptionsPlistPath} \
    -quiet || exit
    
    echo '///-------------'
    echo '/// 开始上传ipa包 '
    echo '///-------------'
    
    if [ $number == 1 ];then
    #验证并上传到App Store
    # 将-u 后面的XXX替换成自己的AppleID的账号,-p后面的XXX替换成自己的密码(注:如果已开启双重认证,则密码为专用密码,专用密码要在开启双重认证后才能开启)
    altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
    "$altoolPath" --validate-app -f ${exportIpaPath}/${scheme_name}.ipa -u XXX -p XXX -t ios --output-format xml
    "$altoolPath" --upload-app -f ${exportIpaPath}/${scheme_name}.ipa -u XXX -p XXX -t ios --output-format xml
    else
    #上传到Fir
    # 将XXX替换成自己的Fir平台的token
    fir login -T XXX
    fir publish $exportIpaPath/$scheme_name.ipa
    fi
    exit 0
    

    把shell脚本和三个plist配置文件放在工程目录下,将shell脚本做相应修改:

    换成自己项目的工程名和scheme名称

    #工程名 将XXX替换成自己的工程名
    project_name=XXX
    #scheme名 将XXX替换成自己的sheme名
    scheme_name=XXX
    

    下面代码是在上传appStore的时候需要知道appleID 和密码

    #验证并上传到App Store
    # 将-u 后面的XXX替换成自己的AppleID的账号,-p后面的XXX替换成自己的密码(注:如果已开启双重认证,则密码为专用密码,专用密码要在开启双重认证后才能开启)
    altoolPath="/Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/altool"
    "$altoolPath" --validate-app -f ${exportIpaPath}/${scheme_name}.ipa -u XXX -p XXX -t ios --output-format xml
    "$altoolPath" --upload-app -f ${exportIpaPath}/${scheme_name}.ipa -u XXX -p XXX -t ios --output-format xml
    

    这里要注意的一点就是对于开启了双重认证的账号,密码不是账号登录密码,而是app专用密码,app专用密码是要在开启双重认证之后,需要自己去开发者网站的用户信息设置里去生成。

    在上传fir内测平台的时候要自己fir平台的token,进入fir我的应用去获取token,获取方式如下图:

    获取token
    以上就完成了自动化的所有配置。1个shell脚本,3个plist文件对应三种打包环境,文件位置如下:

    开启一键打包上传

    接下来就是一行命令执行自动化打包上传:
    打开终端,cd到要打包的工程目录下,输入"./shell.sh" 回车,如下

    运行打包命令
    这里会让你选择之前配置的3种环境中的一种环境,只能输入1、2、3,如果输入其他的数字会无效,让你重新输入,输入之后回车就开始执行自动化打包上传操作了,上传成功显示如下
    fir上传成功
    appStore上传成功
    自动化打包注意事项

    打包之前,确保证书配置正确,配置plist文件里面的compileBitcode设置为false,否则会打包报错;

    fir-cli安装时由于系统版本原因会提示各种权限不足,解决方式:sudo gem install -n /usr/local/bin fir-cli;

    根据工程类型是.xcodeproj类型还是.workspace,脚本编译代码改成相应的工程类型;

    打包到appStore的时候,对于开启双重认证的开发者账号,密码必须为账户的app专用密码,而不是开发者账号的登录密码。

    总结

    传统的打包方式耗费了我们开发者更多的时间和体力,而且效率低下,出错率也要偏高;利用shell脚本自动化打包,降低了人工操作成本,加快了工作效率。

    相关文章

      网友评论

          本文标题:分利宝iOS自动化打包之旅

          本文链接:https://www.haomeiwen.com/subject/rmwmzqtx.html