亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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  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()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产人妖伪娘一区91| 欧美一级大片在线免费观看| 美女久久久久久久久久久| 日韩中文字幕在线播放| 一区二区三区回区在观看免费视频| 成人福利视频网| 色哟哟亚洲精品一区二区| 成人h视频在线观看播放| 91久久在线播放| 超碰精品一区二区三区乱码| 欧美视频中文字幕在线| 高清日韩电视剧大全免费播放在线观看| 日韩av免费在线播放| 国产日韩欧美在线看| 国产不卡在线观看| 国产一区二区三区免费视频| 黑人巨大精品欧美一区二区免费| 欧美一区视频在线| 国产99久久精品一区二区| 奇门遁甲1982国语版免费观看高清| 国产精品爽爽爽| 亚洲一区二区久久久| 这里只有精品在线播放| 亚洲跨种族黑人xxx| 夜夜躁日日躁狠狠久久88av| 欧美日韩另类视频| 亚洲国产黄色片| 国内精品视频一区| 日韩免费观看在线观看| 国产精品夫妻激情| 欧美乱大交做爰xxxⅹ性3| 91国自产精品中文字幕亚洲| 91亚洲国产成人久久精品网站| 欧美日韩国内自拍| 色综合亚洲精品激情狠狠| 亚洲第一精品夜夜躁人人躁| 精品毛片网大全| 95av在线视频| 午夜精品美女自拍福到在线| 另类专区欧美制服同性| 51久久精品夜色国产麻豆| 亚洲va欧美va国产综合久久| 欧美日韩国产中字| 在线国产精品视频| 国产精品爱啪在线线免费观看| 91在线观看免费观看| 国产成+人+综合+亚洲欧美丁香花| 久久国内精品一国内精品| 韩国v欧美v日本v亚洲| 日韩精品极品在线观看播放免费视频| 中文字幕国产亚洲2019| 日韩在线观看免费av| 成人免费看黄网站| 一本色道久久88精品综合| 日韩成人在线视频观看| 成人免费视频网址| 欧美一级成年大片在线观看| 米奇精品一区二区三区在线观看| 在线亚洲欧美视频| 国产精品第七影院| 亚洲视频综合网| 欧美一级视频在线观看| 国产欧美日韩高清| 亚洲精品成人久久| 色黄久久久久久| 亚洲人成在线观看| 国模私拍视频一区| 国产精品久久久久久久久久三级| 欧美成人精品一区二区三区| 91av网站在线播放| 国产亚洲a∨片在线观看| 亚洲人成毛片在线播放| 午夜精品一区二区三区在线视| 国产精品高清在线观看| 亚洲精品国产欧美| 欧美精品videossex性护士| 久久国产视频网站| 成人黄色大片在线免费观看| 久久777国产线看观看精品| 国产欧美日韩亚洲精品| 少妇精69xxtheporn| 国产不卡av在线免费观看| 国产成人在线一区| 日韩美女免费观看| 亚洲精品自拍第一页| 97av在线视频免费播放| 国产在线精品播放| 国产在线视频一区| 国产精品av在线播放| 欧美日韩国产色| 欧美日韩亚洲精品内裤| 日韩av成人在线观看| 日韩视频在线免费观看| 国产精品白丝jk喷水视频一区| 中文亚洲视频在线| 久久九九热免费视频| 日韩av成人在线观看| 亚洲aⅴ日韩av电影在线观看| 97国产一区二区精品久久呦| 国产91ⅴ在线精品免费观看| 欧美激情视频三区| 伊人久久久久久久久久久| 日韩中文在线视频| 国产精品wwww| 91牛牛免费视频| 精品成人乱色一区二区| 欧洲美女免费图片一区| 欧美性极品少妇精品网站| 日韩免费中文字幕| 美乳少妇欧美精品| 日韩一区二区三区在线播放| 欧美精品在线免费观看| 91精品在线播放| 日韩精品极品毛片系列视频| 国产在线拍揄自揄视频不卡99| 欧美性黄网官网| 精品日本高清在线播放| 亚洲免费电影在线观看| 欧美性猛交xxxx黑人| 国产精品1区2区在线观看| 亚洲国语精品自产拍在线观看| 精品成人av一区| 欧美激情成人在线视频| 久久国产精品久久久| 91麻豆桃色免费看| 精品国产一区二区三区久久久| 97婷婷大伊香蕉精品视频| 久久色在线播放| 色偷偷88888欧美精品久久久| 国产综合久久久久久| 久久99久久99精品中文字幕| 欧美在线性视频| 欧美激情视频在线免费观看 欧美视频免费一| www.日韩av.com| 欧美激情亚洲另类| 日韩免费看的电影电视剧大全| 色妞欧美日韩在线| 精品久久久久久中文字幕大豆网| 日韩美女主播视频| 97超级碰在线看视频免费在线看| 91精品国产91久久久久福利| 日韩女优人人人人射在线视频| 国产精品久久久久久久久久久久久久| 社区色欧美激情 | 亚洲第一区中文99精品| 亚洲aⅴ男人的天堂在线观看| 97精品国产97久久久久久免费| 国产成人精品优优av| 久久99久国产精品黄毛片入口| 一区二区三区视频免费| 亚洲电影在线观看| 国产一区二区三区18| 日韩成人在线播放| 91精品国产高清久久久久久91| 精品香蕉在线观看视频一| 亚洲精品一区中文字幕乱码| 久久久久久亚洲精品中文字幕| 国产一区二区激情| 国产成人精品免费视频| 日韩在线欧美在线| 美女999久久久精品视频| 色无极影院亚洲| 操人视频在线观看欧美| 日韩av影片在线观看|