首页 > 编程 > Python > 正文

Python的iOS自动化打包实例代码

2020-02-15 23:46:35
字体:
来源:转载
供稿:网友

前言

这段时间刚刚学习了一段时间的Python,加上自己是做iOS开发的,就想着用Python来做一个自动化打包,可以自动完成打包,上传到蒲公英,并且发送邮箱给测试人员.

一是可以减少打包功夫,二来可以练练手,结合自己的工作来输出一点东西.废话不多说,直接上代码...

原理

就是使用xcodebuild来控制Xcode进行一系列的操作,从而完成打包的操作.


为什么要做这个?

在我们日常开发的时候,特别是在内部测试的时间,有可能需要频繁的打包,打包的工作比较繁琐,需要等待点击下一步,选择之类,影响了开发的节奏.(开玩笑,我能有啥节奏...), 为什么不能直接运行,然后完成所有的操作呢?

思路:

从网上查找了一些关于xcodebuild来打包的资料,从而得到:

    找到对应的项目 clean项目 archive项目 export IPA 上传蒲公英 发送邮件 收工

思路有了,动手起来.

运行环境

Python, Xcode

这些需要大家直接去搭建好环境...

准备工作

下载安装pycharm(这只是我开发Python的工具而已,大家可以根据自己喜欢的来选择) 注册并认证蒲公英(不认证的话,是不能上传的) 邮箱开启POP3/SMTP服务(我使用的是QQ邮箱),记录下16位授权码 一个ExportOptions.plist文件, 这个下面会解释为什么需要还有怎么生成! 一份iOS项目代码→_→

完整代码

#!/usr/bin/env python3# -*- coding: utf-8 -*-# @Time : 2018/11/14 11:04 AM# @Author : liangk# @Site :# @File : auto_archive_ios.py# @Software: PyCharmimport osimport requestsimport webbrowserimport subprocessimport timeimport smtplibfrom email.mime.text import MIMETextfrom email import encodersfrom email.header import Headerfrom email.utils import parseaddr, formataddrproject_name = 'TestArchive' # 项目名称archive_workspace_path = '/Users/用户/Desktop/TestArchive' # 项目路径export_directory = 'archive' # 输出的文件夹ipa_download_url = 'https://www.pgyer.com/XXX' #蒲公英的APP地址# 蒲公英账号USER_KEY、API_KEYUSER_KEY = 'XXXXXXXXXXXXXXXXXXXX'API_KEY = 'XXXXXXXXXXXXXXXXXXXX'from_address = 'XXXXXXXXXXXXXXXXXXXX@qq.com' # 发送人的地址password = 'XXXXXXXXXXXXXXXXXXXX' # 邮箱密码换成他提供的16位授权码to_address = 'XXXXXXXXXXXXXXXXXXXX@qq.com' # 收件人地址,可以是多个的smtp_server = 'smtp.qq.com' # 因为我是使用QQ邮箱..class AutoArchive(object):"""自动打包并上传到蒲公英,发邮件通知"""def __init__(self):passdef clean(self):print("/n/n===========开始clean操作===========")start = time.time()clean_command = 'xcodebuild clean -workspace %s/%s.xcworkspace -scheme %s -configuration Release' % (archive_workspace_path, project_name, project_name)clean_command_run = subprocess.Popen(clean_command, shell=True)clean_command_run.wait()end = time.time()# Code码clean_result_code = clean_command_run.returncodeif clean_result_code != 0:print("=======clean失败,用时:%.2f秒=======" % (end - start))else:print("=======clean成功,用时:%.2f秒=======" % (end - start))self.archive()def archive(self):print("/n/n===========开始archive操作===========")# 删除之前的文件subprocess.call(['rm', '-rf', '%s/%s' % (archive_workspace_path, export_directory)])time.sleep(1)# 创建文件夹存放打包文件subprocess.call(['mkdir', '-p', '%s/%s' % (archive_workspace_path, export_directory)])time.sleep(1)start = time.time()archive_command = 'xcodebuild archive -workspace %s/%s.xcworkspace -scheme %s -configuration Release -archivePath %s/%s' % (archive_workspace_path, project_name, project_name, archive_workspace_path, export_directory)archive_command_run = subprocess.Popen(archive_command, shell=True)archive_command_run.wait()end = time.time()# Code码archive_result_code = archive_command_run.returncodeif archive_result_code != 0:print("=======archive失败,用时:%.2f秒=======" % (end - start))else:print("=======archive成功,用时:%.2f秒=======" % (end - start))# 导出IPAself.export()def export(self):print("/n/n===========开始export操作===========")print("/n/n==========请你耐心等待一会~===========")start = time.time()# export_command = 'xcodebuild -exportArchive -archivePath /Users/liangk/Desktop/TestArchive/myArchivePath.xcarchive -exportPath /Users/liangk/Desktop/TestArchive/out -exportOptionsPlist /Users/liangk/Desktop/TestArchive/ExportOptions.plist'export_command = 'xcodebuild -exportArchive -archivePath %s/%s.xcarchive -exportPath %s/%s -exportOptionsPlist %s/ExportOptions.plist' % (archive_workspace_path, export_directory, archive_workspace_path, export_directory, archive_workspace_path)export_command_run = subprocess.Popen(export_command, shell=True)export_command_run.wait()end = time.time()# Code码export_result_code = export_command_run.returncodeif export_result_code != 0:print("=======导出IPA失败,用时:%.2f秒=======" % (end - start))else:print("=======导出IPA成功,用时:%.2f秒=======" % (end - start))# 删除archive.xcarchive文件subprocess.call(['rm', '-rf', '%s/%s.xcarchive' % (archive_workspace_path, export_directory)])self.upload('%s/%s/%s.ipa' % (archive_workspace_path, export_directory, project_name))def upload(self, ipa_path):print("/n/n===========开始上传蒲公英操作===========")if ipa_path:# https://www.pgyer.com/doc/api 具体参数大家可以进去里面查看,url = 'http://www.pgyer.com/apiv1/app/upload'data = {'uKey': USER_KEY,'_api_key': API_KEY,'installType': '1','updateDescription': description}files = {'file': open(ipa_path, 'rb')}r = requests.post(url, data=data, files=files)if r.status_code == 200:# 是否需要打开浏览器# self.open_browser(self)self.send_email()else:print("/n/n===========没有找到对应的ipa===========")return@staticmethoddef open_browser(self):webbrowser.open(ipa_download_url, new=1, autoraise=True)@staticmethoddef _format_address(self, s):name, address = parseaddr(s)return formataddr((Header(name, 'utf-8').encode(), address))def send_email(self):# https://www.pgyer.com/XXX app地址# 只是单纯的发了一个文本邮箱,具体的发附件和图片大家可以自己去补充msg = MIMEText('<html><body><h1>Hello</h1>' +'<p>╮(╯_╰)╭<a href="https://www.pgyer.com/XXX" rel="external nofollow" >应用已更新,请下载测试</a>╮(╯_╰)╭</p>' +'<p>蒲公英的更新会有延迟,具体版本时间以邮件时间为准</p>' +'</body></html>', 'html', 'utf-8')msg['From'] = self._format_address(self, 'iOS开发团队 <%s>' % from_address)msg['Subject'] = Header('来自iOS开发团队的问候……', 'utf-8').encode()server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25server.set_debuglevel(1)server.login(from_address, password)server.sendmail(from_address, [to_address], msg.as_string())server.quit()print("===========邮件发送成功===========")if __name__ == '__main__':description = input("请输入内容:")archive = AutoArchive()archive.clean()            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表