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 相关文章推荐
Python3中多线程编程的队列运作示例
Apr 16 Python
Python中音频处理库pydub的使用教程
Jun 07 Python
Python中int()函数的用法浅析
Oct 17 Python
python生成二维码的实例详解
Oct 29 Python
python自动截取需要区域,进行图像识别的方法
May 17 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
Python实现的爬取百度文库功能示例
Feb 16 Python
Python 读取串口数据,动态绘图的示例
Jul 02 Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 Python
解决python执行较大excel文件openpyxl慢问题
May 15 Python
pandas中DataFrame检测重复值的实现
May 26 Python
深入理解Pytorch微调torchvision模型
Nov 11 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
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
基于PHPexecl类生成复杂的报表表头示例
2016/10/14 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
php和asp语法上的区别总结
2019/05/12 PHP
javascript String 对象
2008/04/25 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
2013/04/07 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
javascript进行四舍五入方法汇总
2014/12/16 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
js电话号码验证方法
2015/09/28 Javascript
详解JavaScript的变量和数据类型
2015/11/27 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
JS表单传值和URL编码转换
2018/03/03 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
python读取Android permission文件
2013/11/01 Python
Python代码的打包与发布详解
2014/07/30 Python
尝试用最短的Python代码来实现服务器和代理服务器
2016/06/23 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
python中星号变量的几种特殊用法
2016/09/07 Python
Python OpenCV利用笔记本摄像头实现人脸检测
2020/08/20 Python
利用Django模版生成树状结构实例代码
2019/05/19 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
is_file和file_exists效率比较
2021/03/14 PHP
东芝官网商城:还原日式美学,打造美好生活
2018/12/27 全球购物
两道JAVA笔试题
2016/09/14 面试题
即将毕业大学生自荐信
2014/01/24 职场文书
中学教师自我鉴定
2014/02/07 职场文书
高二化学教学反思
2016/02/22 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
MySQL数据迁移相关总结
2021/04/29 MySQL
MySQL kill不掉线程的原因
2021/05/07 MySQL
vue+springboot实现登录验证码
2021/05/27 Vue.js
如何将JavaScript将数组转为树形结构
2021/06/02 Javascript
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android