前言

在iOS开发中,我们常用的打包上传方式就是用Xcode的archive方式打包。到了测试阶段,需要频繁的打包提交到测试平台,整个流程包括:编译-打包-上传,整个过程需要我们去坚守每一步操作,提交app store同样免不了一系列复杂动手操作过程。

对此,我们研究了iOS自动化打包,通过使用shell脚本,输入命令,一键打包上传,提高工作效率。

在了解自动化打包之前,我们先看下我们传统的打包方式:

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

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

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

通过编译归档之后生成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,获取方式如下图:

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

开启一键打包上传

接下来就是一行命令执行自动化打包上传:

打开终端,cd到要打包的工程目录下,输入"./shell.sh" 回车,如下

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

自动化打包注意事项

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

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

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

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

总结

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

- END -

更多推荐内容

《分利宝微服务实践》

《看看前端自动化构建,我们是这样做的》

《Pytest进行UI自动化测试实用操作》

《每个Android开发都必须知道的利器》

《kubernetes 单master集群的搭建》

xcode 选择configuraftions 打包_分利宝IOS自动化打包相关推荐

  1. iOS自动化打包之重签名导出不同证书ipa探索

    在完成基础的自动包打包流程过后, 随即也出现了日常中常见的问题, 比如我们每次需要打出不同网络环境和不同证书的ipa, 由于开发者可以添加的设备只有100个, 而公司的几个项目都是用的一个账号, 各项 ...

  2. iOS自动化打包发布之fastlane 实现 发布AppStore 蒲公英

    iOS自动化打包发布之fastlane 实现 fastlane官方文档 前提插件配置 首先要安装xcode-select 然后安装fastlane sudo gem install fastlane ...

  3. ios自动化打包 替换icon 启动图 bid appname 额外资源

    ios自动化打包脚本 下载地址https://github.com/gwh111/package 打开后自行替换 icon 启动图 bid appname 额外资源 原理:最新的脚本还是一个个替换后再 ...

  4. python项目打包部署到ios_Python的iOS自动化打包实例代码

    前言 这段时间刚刚学习了一段时间的Python,加上自己是做iOS开发的,就想着用Python来做一个自动化打包,可以自动完成打包,上传到蒲公英,并且发送邮箱给测试人员. 一是可以减少打包功夫,二来可 ...

  5. IOS自动化打包介绍

    摘要 随着苹果手持设备用户的不断增加,ios应用也增长迅速,同时随着iphone被越狱越来越多的app 的渠道也不断增多,为各个渠道打包成了一件费时费力的工作,本文提供一种比较智能的打包方式来减少其带 ...

  6. python项目打包部署到ios_Python iOS 自动打包脚本(包含上传到fir)

    Python iOS自动打包脚本 使用说明 1.1 使用python3编写,没有python3 环境的需要下载python3 python官网下载 1.2 通过Homebrew安装Python3 1. ...

  7. android 自动打包脚本,Jenkins实现Android自动化打包

    1.Tomcat 进入 https://tomcat.apache.org/ 官网,下载最新的 tomcat 安装包并且安装. 安装完成后,启动 tomcat 后,在浏览器中输入 http://loc ...

  8. unity安卓打包修改启动画面_Unity自动化打包Android APK

    零. 前言 最近在做Unity开发,有个任务是通过Jenkins实现自动化打包Unity游戏成Android APK的需求,所以在完成任务后,梳理成了一个最简单的教学,也把遇到的坑和大家分享. 若需要 ...

  9. flutter ios打包_关于Flutter iOS打包报错的问题

    今天升级Xcode之后,使用打包机打iOS包的时候,报了一个错,报错的信息如下: note: Using new build systemnote: Building targets in paral ...

最新文章

  1. Android_动态壁纸介绍
  2. Kubernetes 1.5部署sonarqube
  3. “疫”外爆发:没那么简单的视频会议
  4. 浅谈C++类(6)--复制构造函数
  5. 织梦(DEDECMS)首页调用相关投票的方法(自动更新)
  6. 奖励超10万!交大超牛本科生:成果达博士毕业水平,如今保研国家重点实验室...
  7. hdu 1698 Just a Hook
  8. Vue 组件库 (一)
  9. Python数据挖掘工具总结
  10. 计算机小喇叭找不到,如何解决电脑右下角的小喇叭不见了的问题
  11. MacBook Pro键盘功能盘点
  12. Foxmail是否可以隐藏文件夹?【网易企业邮箱申请】
  13. python链家二手房_python采集链家二手房信息
  14. 庸者挣扎泥潭,高手从不恋战
  15. 爆款预订,2022 年最值得关注的后台框架 —— Fantastic-admin
  16. python机器学习之决策树案例——泰坦尼克号幸存者的预测
  17. Android学习-使用WebView在app上显示网页
  18. java计算机毕业设计基于安卓Android的二手交易app-闲置物品交易app-ssm
  19. Maya菜单中英文对照表(一)
  20. SpringMVC工作流程

热门文章

  1. 图解软件定义存储-百炼钢成绕指柔
  2. Mindjet MindManagers思维导图使用记录
  3. 屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键
  4. 新笔记本怎么在桌面添加计算机文件夹,win10桌面悬浮文件夹怎么弄_win10电脑桌面悬浮文件夹如何添加-win7之家...
  5. linux命令lscpu
  6. 网址http格式的拆分
  7. 如果有一个类是 myClass , 关于下面代码正确描述的是?
  8. 内存管理中的几种地址类型
  9. 《游戏力》读书笔记作文4700字
  10. 轻量级流程图控件GoJS示例连载(一):最小化