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的gevent框架下执行异步的Solr查询的教程
Apr 16 Python
python实现隐马尔科夫模型HMM
Mar 25 Python
详解python单元测试框架unittest
Jul 02 Python
python十进制和二进制的转换方法(含浮点数)
Jul 07 Python
浅谈python写入大量文件的问题
Nov 09 Python
python中dir()与__dict__属性的区别浅析
Dec 10 Python
python3实现表白神器
Apr 09 Python
对Django 转发和重定向的实例详解
Aug 06 Python
Django中间件拦截未登录url实例详解
Sep 03 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
Feb 27 Python
详解用Python进行时间序列预测的7种方法
Mar 13 Python
使用python脚本自动生成K8S-YAML的方法示例
Jul 12 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
ThinkPHP令牌验证实例
2014/06/18 PHP
PHP实现微信发红包程序
2015/08/24 PHP
php生成酷炫的四个字符验证码
2016/04/22 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
Aster vs KG BO3 第二场2.18
2021/03/10 DOTA
搞定immutable.js详细说明
2016/05/02 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
jQuery实现的省市县三级联动菜单效果完整实例
2016/08/01 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
JS控制HTML元素的显示和隐藏的两种方法
2016/09/27 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
简单谈谈Python流程控制语句
2016/12/04 Python
python基本语法练习实例
2017/09/19 Python
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
2018/12/13 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
python打印n位数“水仙花数”(实例代码)
2019/12/25 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
python中return不返回值的问题解析
2020/07/22 Python
pyx文件 生成pyd 文件用于 cython调用的实现
2021/03/04 Python
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
荷兰在线钓鱼商店:Raven
2019/06/26 全球购物
给导游的表扬信
2014/01/10 职场文书
接受捐赠答谢词
2014/01/27 职场文书
2014年教研活动总结范文
2014/04/26 职场文书
党的群众路线教育实践活动对照检查材料思想汇报(党员篇)
2014/09/25 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
MySQL 全文检索的使用示例
2021/06/07 MySQL
win10清理dns缓存
2022/04/19 数码科技
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android