麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > 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 = '[email protected]' # 發送人的地址password = 'XXXXXXXXXXXXXXXXXXXX' # 郵箱密碼換成他提供的16位授權碼to_address = '[email protected]' # 收件人地址,可以是多個的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  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()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中国免费一级毛片 | 毛片视频观看 | 亚洲人成免费 | 99激情| 毛片在线视频在线播放 | www.com超碰 | 欧美激情图区 | 欧美黄色片一级 | 女人一级一级毛片 | 精品国产一区二区三区四区阿崩 | 一级黄色免费观看 | videos高潮 | av噜噜在线| 久久久三级免费电影 | 美女毛片儿 | 国产午夜精品一区二区三区免费 | 国产精品久久久久久久不卡 | 欧美久久久一区二区三区 | 美国一级黄色毛片 | 曰韩一二三区 | xnxx 日本免费 | 日日狠狠久久偷偷四色综合免费 | 欧美一级黄色片免费观看 | 1314成人网 | 日本成人在线播放 | 成人在线a | 男男啪羞羞视频网站 | 久久精品久久精品国产大片 | 久久国产精品影视 | 永久免费不卡在线观看黄网站 | 免费看性xxx高清视频自由 | 国产成人自拍视频在线 | 欧美色性| 国产九九九九 | 黄网站免费入口 | 亚洲精久| 亚洲成人在线视频网 | 亚洲无线看 | 666sao| 欧美老外a级毛片 | 91网视频 |