python项目打包部署到ios_Python实现iOS自动化打包详解
可能是最简单的iOS自动化打包方式:无需手动配置证书,无需填写配置文件名称,更无需配置Bundle Identifer,总之无需很多繁琐配置,让打包流程一句命令完成!下面将会分享两种打包方式,一种是快速打包(打包时间就在一眨眼),一种是基于shenzhen(速度会比较慢),都实现了一行命令完成打包并上传蒲公英!
注意:
基于编译的打包
这种打包方式应该是目前所有打包方式中最快的,就是编译工程–找到.app文件–新建Payload文件夹–拷贝.app到Payload文件夹–压缩成zip–更改后缀名为ipa–完成!
演示过程如下图
过程自动化
注意:输入日志描述只能输入数字,非数字会报错。
在上图中,我们只需要执行python脚本,可以看到桌面很快生成了一个ProgramBag的文件夹,打开文件夹,彩蛋就在里面了!由于我写的脚本里包含了上传蒲公英的代码,网络不太好会影响上传时间,真正的打包时间是可以忽略不记的,也就是执行脚本,敲击回车就好了的事!
这里我们将打好的包自动上传到蒲公英网站,完成后自动打开下载地址,这个过程在网络好的条件下2分钟左右完成,99.9%的时间是发在上传包上!这里上传完成会自动打开到下载的网页。
原理实现
Python的具体代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90#!/usr/bin/env python
#coding=utf-8
import os
import commands
import requests
import webbrowser
'''
使用注意事项:该脚本基于python3.6.5
1、将工程的编译设备选成 Gemeric iOS Device
2、command + B编译
3、执行脚本文件
'''
appFileFullPath = '/Users/wubin/Library/Developer/Xcode/DerivedData/FotileStyle-doiplszeqpeztmcrysurltpnhepy/Build/Products/Debug-iphonesimulator/FotileStyle.app'
PayLoadPath = '/Users/wubin/Desktop/Payload'
packBagPath = '/Users/wubin/Desktop/ProgramBag'
#将此处打开的链接改为蒲公英对应app的链接
openUrl = 'https://www.pgyer.com/manager/dashboard/app/40c633aa8dc0ba15191632860558825e'
#上传蒲公英
USER_KEY = "b3a0b9*******************ed6fb2"
API_KEY = "1fda5e1*******************a95737"
#上传蒲公英
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':des
}
files={'file':open(IPAPath,'rb')}
r=requests.post(url,data=data,files=files)
def openDownloadUrl():
webbrowser.open(openUrl,new=1,autoraise=True)
print "n*************** 更新成功 *********************n"
#编译打包流程
def bulidIPA():
#打包之前先删除packBagPath下的文件夹
commands.getoutput('rm -rf %s'%packBagPath)
#创建PayLoad文件夹
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')
#创建PayLoad文件夹
def mkdir(PayLoadPath):
isExists = os.path.exists(PayLoadPath)
if not isExists:
os.makedirs(PayLoadPath)
print PayLoadPath + '创建成功'
return True
else:
print PayLoadPath + '目录已经存在'
return False
if __name__ == '__main__':
des = input("请输入更新的日志描述:")
bulidIPA()
uploadIPA('%s/Payload.ipa'%packBagPath)
openDownloadUrl()
def bulidIPA():其实就是liunx命令,通过脚本包装了一层,可以理解为我们以前在terminal手动输入的命令,现在是自动帮我们输入并执行了,大大解放了我们的双手!
1
2#打包之前先删除packBagPath下的文件夹
commands.getoutput('rm -rf %s'%packBagPath)
分析上面这一句,我用OC的伪代码来实现的话对应下面这句:所以上面的%s相当于OC中的%@,代表一种格式符,后面的appFileFullPath代表我们工程的.app存放的路径,PayLoadPath代表我们在桌面上新建的PayLoad文件路径
1copy("%@,%@",A,B)
结合注释基本上代码的执行过程我们就一目了然了,至于前面的commands.getoutput是基于commands组件的命令,理解为可以在terminal执行命令即可,下面有一句代码需要说明:这是一句切换当前目录的命令
1os.chdir(packBagPath)
等价于
1commands.getoutput('cd %s'%packBagPath)
不要问我为什么没有用下面的命令,那是因为这句命令我这边执行不成功,被坑了很久,至于原因,还不知道为什么(如果你解决了,欢迎骚扰我),所以用上面python提供的命令代替了。
上传蒲公英脚本1
2def uploadIPA(IPAPath):
表示定义了一个函数uploadIPA,接受一个参数
requests是一个网络请求的组件,我们可以把它类比为AFNetWorking,data是要传递的参数,files是要传递的文件,至于上传的参数key都是根据蒲公英提供的API来写的。上面的password代表安装app时所需要的密码,同时还有两个参数,USER_KEY和API_KEY,在蒲公英应用的位置可以找到,如图:
1
2
3def openDownloadUrl():
webbrowser.open(openUrl,new=1,autoraise=True)
print "n*************** 更新成功 *********************n"
webbrowser也是一个组件库,这些组件库在使用时,和OC一样都要先import里面的地址代表蒲公英上应用的地址,拷过来粘贴即可!
配置永久参数1
2
3
4
5
6
7
8
9
10appFileFullPath = '/Users/wubin/Library/Developer/Xcode/DerivedData/FotileStyle-doiplszeqpeztmcrysurltpnhepy/Build/Products/Debug-iphonesimulator/FotileStyle.app'
PayLoadPath = '/Users/wubin/Desktop/Payload'
packBagPath = '/Users/wubin/Desktop/ProgramBag'
#将此处打开的链接改为蒲公英对应app的链接
openUrl = 'https://www.pgyer.com/manager/dashboard/app/40c633aa8dc0ba15191632860558825e'
#上传蒲公英
USER_KEY = "b3a0b9*******************ed6fb2"
API_KEY = "1fda5e1*******************a95737"
上图中appFileFullPath就是我们工程文件中.app的地址,至于PayLoadPath和packBagPath只需要你将wubin用户名修改为你自己电脑的用户名即可!
shenzhen打包
shenzhen是一个打包相关的库,使用也非常方便,比第一中打包方式还要少一个路径配置,当然打包的速度相对比较慢,要使用下面的脚本,首先得安装shenzhen链接。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67#!/usr/bin/env python
#coding=utf-8
import os,time
#import commands
import subprocess
import requests
import webbrowser
import time
#上传蒲公英
USER_KEY = "b3a0b950c29d1d081aaf6a0ba6ed6fb2"
API_KEY = "1fda5e1404ddb402d7e7c186d0a95737"
def searchIpaPath():
IpaPath=""
for i in os.listdir("."):
if(i.find('.ipa')!=(-1)):
IpaPath=i
print '找到的IPA文件:'+IpaPath
return IpaPath
return IpaPath
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':des
}
files={'file':open(IPAPath,'rb')}
r=requests.post(url,data=data,files=files)
def openDownloadUrl():
#此处的地址需要换成蒲公英上自己对应的应用地址
webbrowser.open(r'https://www.pgyer.com/manager/dashboard/app/40c633aa8dc0ba15191632860558825e',new=1,autoraise=True)
print "n*************** 更新成功 *********************n"
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"
if __name__ == '__main__':
#输入日志格式为 "修改bug" 记得加上双引号,如果有多行可以这么写:
# "1 修改首页bug n 2 修改点击按钮闪退问题 "
des = input("请输入更新的日志描述:")
buildIpa()
IpaPath=searchIpaPath()
uploadIPA(IpaPath)
openDownloadUrl()
这里我主要是将shenzhen的打包命令”ipa build”封装在pythone脚本中,同时记录了打包的时间,经过测试打包的时间在4 ~ 7分钟左右,这个脚本中只需要配置蒲公英的USER_KEY和API_KEY,然后cd到当前工程目录,执行脚本即可!打包成功会在当前工程目录下生成ipa包和符号化文件!使用如下:
python项目打包部署到ios_Python实现iOS自动化打包详解相关推荐
- python项目打包部署到ios_Python的iOS自动化打包实例代码
前言 这段时间刚刚学习了一段时间的Python,加上自己是做iOS开发的,就想着用Python来做一个自动化打包,可以自动完成打包,上传到蒲公英,并且发送邮箱给测试人员. 一是可以减少打包功夫,二来可 ...
- python123 ios_Python的iOS自动化打包实例代码
Hello ' + ' ╮(╯_╰)╭应用已更新,请下载测试╮(╯_╰)╭ ' + ' 蒲公英的更新会有延迟,具体版本时间以邮件时间为准 ' + '
- xcode 选择configuraftions 打包_分利宝IOS自动化打包
前言 在iOS开发中,我们常用的打包上传方式就是用Xcode的archive方式打包.到了测试阶段,需要频繁的打包提交到测试平台,整个流程包括:编译-打包-上传,整个过程需要我们去坚守每一步操作,提交 ...
- iOS自动化打包之重签名导出不同证书ipa探索
在完成基础的自动包打包流程过后, 随即也出现了日常中常见的问题, 比如我们每次需要打出不同网络环境和不同证书的ipa, 由于开发者可以添加的设备只有100个, 而公司的几个项目都是用的一个账号, 各项 ...
- iOS自动化打包发布之fastlane 实现 发布AppStore 蒲公英
iOS自动化打包发布之fastlane 实现 fastlane官方文档 前提插件配置 首先要安装xcode-select 然后安装fastlane sudo gem install fastlane ...
- ios自动化打包 替换icon 启动图 bid appname 额外资源
ios自动化打包脚本 下载地址https://github.com/gwh111/package 打开后自行替换 icon 启动图 bid appname 额外资源 原理:最新的脚本还是一个个替换后再 ...
- [万字长文]使用 React 重写学成在线前端项目 I 代码完整可运行,步骤有详解
[万字长文]使用 React 重写学成在线前端项目 I 代码完整可运行,步骤有详解 准备工作 安装必备工具/库 nodejs React 脚手架 需要的 node 依赖包 分析需求 初始化项目 搭建框 ...
- Python Unittest-根据不同测试环境跳过用例详解
Python Unittest-根据不同测试环境跳过用例详解 本文章会讲述以下几个内容: 1.Unittest 如何跳过用例 2.如何使用sys.argv 3.自动化测试项目中如何一套代码多套环境运行 ...
- python post json参数,Python requests.post方法中data与json参数区别详解
在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json. data与json既可以是str类型,也可以是dict类型. 区别: 1.不管json是 ...
- iOS核心动画详解swift版----基础动画
2019独角兽企业重金招聘Python工程师标准>>> iOS核心动画详解swift版---基础动画 创建工程,添加2个ViewController,通过rootViewContro ...
最新文章
- TensorFlow学习笔记(1):variable与get_variable, name_scope()和variable_scope()
- Linux进程编程(PS: exec族函数、system、popen函数)
- Thinkphp 验证码、文件上传
- linux之openssl简单介绍
- python文件传输socket_树莓派采用socket方式文件传输(python)
- 为什么没有普及128位操纵系统的计算机?
- 极简的js点击组图切换效果
- [android底层]jni中获取自定义的类函数编写
- 海康ps流转换h264流
- java安装包_java JDK安装包的获取与安装
- python唯美壁纸_Python爬虫教程爬取5K分辨率超清唯美壁纸源码
- 基于Hyperworks和LSDYNA的挤压仿真
- android gps 方位角,GPS坐标系中的方位角计算
- 饮食不规律,脾胃出现问题的人越来越多,该怎么办?
- 计算机网络——路由器和交换机
- 大数据系统及分析技术
- 在apache中开启deflate方法的总结
- 小猫咪图床源码,一款PHP超简洁本地图床
- 区块链可以当仁不让地成为元宇宙的「母体」,并不断为元宇宙的发展提供能量
- SUBMIT 的使用方法...