Python实现iOS自动化打包详解步骤


Posted in Python onOctober 03, 2018

可能是最简单的iOS自动化打包方式:无需手动配置证书,无需填写配置文件名称,更无需配置Bundle Identifer,总之无需很多繁琐配置,让打包流程一句命令完成!下面将会分享两种打包方式,一种是快速打包(打包时间就在一眨眼),一种是基于shenzhen(速度会比较慢),都实现了一行命令完成打包并上传蒲公英!

一:基于编译的打包

这种打包方式应该是目前所有打包方式中最快的,就是编译工程--找到.app文件--新建Payload文件夹--拷贝.app到Payload文件夹--压缩成zip--更改后缀名为ipa--完成!

1.我们演示过程如下图:

Python实现iOS自动化打包详解步骤

手动打包

2.其实上面的打包过程快的话2分钟左右可以完成,作为一个追求效率的攻城狮,怎么可能满足在此,而基于测试包的频繁性,我们肯定不想一直做这样重复性而没多少技术含量的工作,接下来,我们就把这个过程自动化!

Python实现iOS自动化打包详解步骤

自动化打包1

在上图中,我们只需要执行python脚本,可以看到桌面很快生成了一个ProgramBag的文件夹,打开文件夹,彩蛋就在里面了!由于我写的脚本里包含了上传蒲公英的代码,这个包有28.3M,网络不太好会影响上传时间,真正的打包时间是可以忽略不记的,也就是执行脚本,敲击回车就好了的事!

Python实现iOS自动化打包详解步骤

自动化打包2

这里我们将打好的包自动上传到蒲公英网站,完成后自动打开下载地址,这个过程在网络好的条件下2分钟左右完成,99.9%的时间是发在上传包上!这里上传完成会自动打开到下载的网页。

3.演示过程完毕,接下来我们就来看看原理是怎么实现的吧!下面开始讲解Python的具体代码~ 静心看完,相信你能看懂,说不定自己也可以很快写一个脚本,用来解决平常重复性的工作。下面是核心打包脚本:

#编译打包流程
def bulidIPA():
  mkdir(PayLoadPath)
  #将app拷贝到PayLoadPath路径下
  commands.getoutput('cp -r %s %s'%(appFileFullPath,PayLoadPath))
  #在桌面上创建packBagPath的文件夹
  commands.getoutput('mkdir -p %s'%packBagPath)
  #将PayLoadPath文件夹拷贝到packBagPath文件夹下
  commands.getoutput('cp -r %s %s'%(PayLoadPath,packBagPath))
  #删除桌面的PayLoadPath文件夹
  commands.getoutput('rm -rf %s'%(PayLoadPath))
  #切换到当前目录
  os.chdir(packBagPath)
  #压缩packBagPath文件夹下的PayLoadPath文件夹夹
  commands.getoutput('zip -r ./Payload.zip .')
  print "\n*************** 打包成功 *********************\n"
  #将zip文件改名为ipa
  commands.getoutput('mv Payload.zip Payload.ipa')
  #删除payLoad文件夹
  commands.getoutput('rm -rf ./Payload')

有没有似曾相识的感觉?看绿色文字的部分,其实就是liunx命令,通过脚本包装了一层,可以理解为我们以前在terminal手动输入的命令,现在是自动帮我们输入并执行了,大大解放了我们的双手!

#将app拷贝到PayLoadPath路径下
  commands.getoutput('cp -r %s %s'%(appFileFullPath,PayLoadPath))

我们来分析上面这一句,我用OC的伪代码来实现的话对应下面这句:所以上面的%s相当于OC中的%@,是一种格式符,后面的appFileFullPath代表我们工程的.app存放的路径,PayLoadPath代表我们在桌面上新建的PayLoad文件路径

copy("%@,%@",A,B)

然后结合注释(自恋下:注释写的还算挺详细的)基本上代码的执行过程我们就一目了然了,至于前面的commands.getoutput是基于commands组件的命令,理解为可以在terminal执行命令即可,下面有一句代码需要说明:这是一句切换当前目录的命令

os.chdir(packBagPath)

等价于

commands.getoutput('cd %s'%packBagPath)

不要问我为什么没有用下面的命令,那是因为这句命令我这边执行不成功,被坑了很久,至于原因,还不知道为什么(如果你解决了,欢迎骚扰我),所以用上面python提供的命令代替了。

4.至此,我们将第一步的手动打包过程实现了自动话,如果不需要上传蒲公英,上面的9行命令就够用了!接下来我们实现上传蒲公英的脚本:

#上传蒲公英
def uploadIPA(IPAPath):
  if(IPAPath==''):
    print "\n*************** 没有找到对应上传的IPA包 *********************\n"
    return
  else:
    print "\n***************开始上传到蒲公英*********************\n"
    url='http://www.pgyer.com/apiv1/app/upload'
    data={
      'uKey':USER_KEY,
      '_api_key':API_KEY,
      'installType':'2',
      'password':'',
      'updateDescription':"测试自动化打包"
    }
    files={'file':open(IPAPath,'rb')}
    r=requests.post(url,data=data,files=files)
def uploadIPA(IPAPath):
表示定义了一个函数uploadIPA,接受一个参数

requests是一个网络请求的组件,我们可以把它类比为AFNetWorking,data是要传递的参数,files是要传递的文件,至于上传的参数key都是根据蒲公英提供的API来写的。上面的password代表安装app时所需要的密码,同时还有两个参数,USER_KEY和API_KEY,在蒲公英应用的位置可以找到,如图:

Python实现iOS自动化打包详解步骤

KEY说明

5.最后一步就是上传成功,帮我们自动打开下载页:

def openDownloadUrl():
  webbrowser.open(r'https://www.pgyer.com/manager/dashboard/app/40c633aa8dc0ba15191632860558825e',new=1,autoraise=True)
  print "\n*************** 更新成功 *********************\n"

webbrowser也是一个组件库,这些组件库在使用时,和OC一样,都要先import,里面的地址代表蒲公英上应用的地址,拷过来粘贴即可!

6.整体的脚本就完了,最后在使用时配置下面的几个参数即可,一次配置,永久使用!

appFileFullPath = '/Users/Qinz/Library/Developer/Xcode/DerivedData/DDDS-bcghxucdqelptddawpsfmvjtoefm/Build/Products/Debug-iphoneos/DDDS.app'
PayLoadPath = '/Users/Qinz/Desktop/Payload'
packBagPath = '/Users/Qinz/Desktop/ProgramBag'

#上传蒲公英
USER_KEY = "61ded40a68axxxxxxe9fd278acd2"
API_KEY = "a4fe2724dc6d8cxxxxxxf1994eec219e"

上图中appFileFullPath就是我们工程文件中.app的地址,至于PayLoadPath和packBagPath只需要你将"Qinz"用户名修改为你自己电脑的用户名即可!

下图演示快速设置appFileFullPath的过程:

Python实现iOS自动化打包详解步骤

appFileFullPath

到此,第一种自动化打包方式讲解完毕!

二:基于shenzhen打包,shenzhen是一个打包相关的库,使用也非常方便,比第一中打包方式还要少一个路径配置,当然打包的速度相对比较慢,要使用下面的脚本,首先得安装shenzhen,具体可参考https://github.com/nomad/shenzhen

def buildIpa():
  start = time.time()
  print "\n*************** IPA包生成中 *********************\n"
   #commands.getoutput('ipa build') #使用shenzheng打包ipa
  p = subprocess.Popen('ipa build', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  for line in p.stdout.readlines():
    print line,
  retval = p.wait()

  end = time.time()
  print "--------- 打包耗时:%s秒 ---------"%(end-start)
  print "\n*************** IPA包生成成功,准备上传蒲公英 *********************\n"

这里我主要是将shenzhen的打包命令"ipa build"封装在pythone脚本中,同时记录了打包的时间,经过测试打包的时间在4~7分钟左右,这个脚本中只需要配置蒲公英的USER_KEY和API_KEY,然后cd到当前工程目录,执行脚本即可!打包成功会在当前工程目录下生成ipa包和符号化文件!使用如下:

Python实现iOS自动化打包详解步骤

脚本打包

这里的描述日志是更新到蒲公英的填写的更新日志,最后打包完成记录如下,同时也是支持蒲公英上传的,最后完成如图:

Python实现iOS自动化打包详解步骤

image.png

Python实现iOS自动化打包详解步骤

WechatIMG30.jpeg

可以看到,打包时间耗时将近5分钟,在我看来时间还是有点长的,所以要想快速打包测试,使用第一种方式能提高不少工作效率!

踩坑之旅:完成这个脚本的过程中,可以说是一部心酸史,一把辛酸泪,踩了不少坑(主要是之前不懂脚本),网上很多关于自动化打包的文章,下载下来执行后就没成功过,有的是需要配置一些参数,繁琐的不像自动化,目前很流行的自动化打包库fastlane,在我使用时,按照官方的教程打包就没有一次成功过,还有就是报错后都不知道怎么解决,打包就像碰运气,心里完全没底,可以说被折磨的体无完肤,经过多次失败的经历后,我决定要自己撸一个脚本,于是学习下Python脚本的语法,也就有了现在的这个版本!关于AppStore的包,还是建议使用Xcode打包!

最后,附上这两个脚本的下载地址:

iOS自动化打包脚本:https://github.com/ys323945/iOSAutoPage/tree/master

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
Mar 30 Python
python计算文本文件行数的方法
Jul 06 Python
Python django使用多进程连接mysql错误的解决方法
Oct 08 Python
Python动态赋值的陷阱知识点总结
Mar 17 Python
python自动化之Ansible的安装教程
Jun 13 Python
Python中一个for循环循环多个变量的示例
Jul 16 Python
使用Python调取任意数字资产钱包余额功能
Aug 15 Python
python3获取url文件大小示例代码
Sep 18 Python
Python Django中间件使用原理及流程分析
Jun 13 Python
python requests库的使用
Jan 06 Python
Python加密与解密模块hashlib与hmac
Jun 05 Python
Python中GIL的使用详解
Oct 03 #Python
Python线程同步的实现代码
Oct 03 #Python
详解通过API管理或定制开发ECS实例
Sep 30 #Python
Python 使用类写装饰器的小技巧
Sep 30 #Python
浅谈django三种缓存模式的使用及注意点
Sep 30 #Python
使用Python实现租车计费系统的两种方法
Sep 29 #Python
Python实现App自动签到领取积分功能
Sep 29 #Python
You might like
基于mysql的论坛(7)
2006/10/09 PHP
PHP生成静态页面详解
2006/11/19 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
浅谈PHP封装CURL
2019/03/06 PHP
在textarea文本域中显示HTML代码的方法
2007/03/06 Javascript
Javascript & DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
Javascript学习笔记之数组的构造函数
2014/11/23 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
基于JS实现省市联动效果代码分享
2016/06/06 Javascript
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
2016/11/01 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
深入浅析Nodejs的Http模块
2017/06/20 NodeJs
JS+HTML5 FileReader实现文件上传前本地预览功能
2020/03/27 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
理解 JavaScript EventEmitter
2018/03/29 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
2019/07/24 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
vue props对象validator自定义函数实例
2019/11/13 Javascript
d3.js实现图形缩放平移
2019/12/19 Javascript
jquery检测上传文件大小示例
2020/04/26 jQuery
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
Django压缩静态文件的实现方法详析
2018/08/26 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
基于Python爬取京东双十一商品价格曲线
2020/10/23 Python
小程序瀑布流解决左右两边高度差距过大的问题
2019/02/20 HTML / CSS
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
倩碧英国官网:Clinique英国
2018/08/10 全球购物
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
新三好学生主要事迹
2014/01/23 职场文书
vue中利用mqtt服务端实现即时通讯的步骤记录
2021/07/01 Vue.js