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之list和str比较
Sep 20 Python
Python HTMLParser模块解析html获取url实例
Apr 08 Python
简单介绍Python中的struct模块
Apr 28 Python
Python实现字典依据value排序
Feb 24 Python
Python 爬取携程所有机票的实例代码
Jun 11 Python
python实现简单登陆系统
Oct 18 Python
Python Numpy计算各类距离的方法
Jul 05 Python
Python Collatz序列实现过程解析
Oct 12 Python
PyTorch和Keras计算模型参数的例子
Jan 02 Python
python 解决Fatal error in launcher:错误问题
May 21 Python
Python使用Matlab命令过程解析
Jun 04 Python
python基础之//、/与%的区别详解
Jun 10 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
关于尾递归的使用详解
2013/05/02 PHP
php网页标题中文乱码的有效解决方法
2014/03/05 PHP
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
通过php添加xml文档内容的方法
2015/01/23 PHP
yii2.0实现验证用户名与邮箱功能
2015/12/22 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
JS实现图片预加载无需等待
2012/12/21 Javascript
jquery实现智能感知连接外网搜索
2013/05/21 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
js出生日期 年月日级联菜单示例代码
2014/01/10 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
2014/01/15 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
jfinal与bootstrap的登录跳转实战演习
2015/09/22 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
2017/03/09 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
JavaScript实现移动端页面按手机屏幕分辨率自动缩放的最强代码
2017/08/18 Javascript
vue路由 遍历生成复数router-link的例子
2019/10/30 Javascript
Python创建系统目录的方法
2015/03/11 Python
Django命名URL和反向解析URL实现解析
2019/08/09 Python
给 TensorFlow 变量进行赋值的方式
2020/02/10 Python
python制作抽奖程序代码详解
2021/01/15 Python
利用CSS3的checked伪类实现OL的隐藏显示的方法
2010/12/18 HTML / CSS
彪马法国官网:PUMA法国
2019/12/15 全球购物
军训自我鉴定
2013/12/14 职场文书
药学职务聘任书
2014/03/29 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
乡镇党委书记第三阶段个人整改措施
2014/09/16 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
2014年公司工作总结
2014/11/22 职场文书
团代会开幕词
2015/01/28 职场文书
大学生毕业个人总结
2015/02/15 职场文书
2015年出纳个人工作总结
2015/04/02 职场文书
天堂的孩子观后感
2015/06/11 职场文书