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

首頁 > 編程 > Python > 正文

Python的iOS自動化打包實例代碼

2020-02-15 23:46:35
字體:
來源:轉載
供稿:網友

前言

這段時間剛剛學習了一段時間的Python,加上自己是做iOS開發(fā)的,就想著用Python來做一個自動化打包,可以自動完成打包,上傳到蒲公英,并且發(fā)送郵箱給測試人員.

一是可以減少打包功夫,二來可以練練手,結合自己的工作來輸出一點東西.廢話不多說,直接上代碼...

原理

就是使用xcodebuild來控制Xcode進行一系列的操作,從而完成打包的操作.


為什么要做這個?

在我們日常開發(fā)的時候,特別是在內部測試的時間,有可能需要頻繁的打包,打包的工作比較繁瑣,需要等待點擊下一步,選擇之類,影響了開發(fā)的節(jié)奏.(開玩笑,我能有啥節(jié)奏...), 為什么不能直接運行,然后完成所有的操作呢?

思路:

從網上查找了一些關于xcodebuild來打包的資料,從而得到:

    找到對應的項目 clean項目 archive項目 export IPA 上傳蒲公英 發(fā)送郵件 收工

思路有了,動手起來.

運行環(huán)境

Python, Xcode

這些需要大家直接去搭建好環(huán)境...

準備工作

下載安裝pycharm(這只是我開發(fā)Python的工具而已,大家可以根據(jù)自己喜歡的來選擇) 注冊并認證蒲公英(不認證的話,是不能上傳的) 郵箱開啟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' # 發(fā)送人的地址password = 'XXXXXXXXXXXXXXXXXXXX' # 郵箱密碼換成他提供的16位授權碼to_address = 'XXXXXXXXXXXXXXXXXXXX@qq.com' # 收件人地址,可以是多個的smtp_server = 'smtp.qq.com' # 因為我是使用QQ郵箱..class AutoArchive(object):"""自動打包并上傳到蒲公英,發(fā)郵件通知"""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)# 創(chuàng)建文件夾存放打包文件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 具體參數(shù)大家可以進去里面查看,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地址# 只是單純的發(fā)了一個文本郵箱,具體的發(fā)附件和圖片大家可以自己去補充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開發(fā)團隊 <%s>' % from_address)msg['Subject'] = Header('來自iOS開發(fā)團隊的問候……', 'utf-8').encode()server = smtplib.SMTP(smtp_server, 25) # SMTP協(xié)議默認端口是25server.set_debuglevel(1)server.login(from_address, password)server.sendmail(from_address, [to_address], msg.as_string())server.quit()print("===========郵件發(fā)送成功===========")if __name__ == '__main__':description = input("請輸入內容:")archive = AutoArchive()archive.clean()            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
av在线中出| 免费看91视频| 菠萝蜜一区二区| 在线观看欧美日韩国产| 中文字幕毛片| 国产对白叫床清晰在线播放| 欧美激情福利视频在线观看免费| 国产精一品亚洲二区在线视频| 国产综合婷婷| 亚洲天堂电影网| www.男人天堂网| 中文字幕免费高清在线| 亚洲欧美偷拍视频| 亚洲婷婷综合网| 亚洲天堂av在线免费| 青青成人在线| 亚洲精品久久嫩草网站秘色| 亚洲特级黄色片| 蝌蚪91视频| 欧美日韩视频不卡| 欧美剧情电影在线观看完整版免费励志电影| 欧美电影免费看| 99久久亚洲国产日韩美女| 日韩一区二区三区免费| www.色多多| 黄色a级片在线观看| 黄色网址中文字幕| 久久久久久久av| 青青青免费在线视频| 久久久噜噜噜www成人网| 伊人久久五月天| 精品国内亚洲2022精品成人| 欧美日韩福利电影| 日韩网站中文字幕| 成熟人妻av无码专区| 高清乱码免费看污| 五月婷婷六月香| 欧美一区二区在线不卡| 久久久久久91精品色婷婷| 日日噜噜噜噜夜夜爽亚洲精品| 色网综合在线观看| 日本视频在线观看一区二区三区| 91高清一区| 午夜伊人狠狠久久| 无码精品一区二区三区在线播放| 国产精品国产av| 看全色黄大色大片| 狠狠躁少妇一区二区三区| 国产亚洲精品美女久久久| 欧美性猛交xxx高清大费中文| 五月综合久久| 国产高清无密码一区二区三区| 欧美刺激午夜性久久久久久久| 日本美女一级视频| 可骚可骚的黄视频网站| 日韩欧美在线观看| 欧美自拍视频在线观看| 国产三级精品在线| 91久久在线观看| 在线观看av一区| 欧美日韩国产免费一区二区三区| 国产三级在线免费| 91福利在线播放| 国产精品久久久久久久免费| 日本欧美高清| 欧美三级网址| 日韩经典一区二区三区| 交100部在线观看| 日韩专区一卡二卡| 日韩在线播放视频| 加勒比海盗1在线观看免费国语版| 亚洲国产午夜伦理片大全在线观看网站| 青娱乐91视频| 国产精品精品视频| 精品人伦一区二区三电影| 91亚洲国产成人精品一区二区三| 色999日韩国产欧美一区二区| 久久久久97国产| 潘金莲一级黄色片| 国产伦精品一区二区三区高清| 91精品国产成人| 狠狠艹夜夜干| 国产av无码专区亚洲精品| 91精品国产经典在线观看| 老熟妇仑乱一区二区av| 成人3d动漫网站| 成人国产精品色哟哟| 欧美日韩一区二区免费在线观看| 免费毛片在线播放| 精品久久久久久电影| 亚洲精品一区中文| 国产麻豆精品入口在线观看| 欧美精品久久久久久久久久丰满| 欧美黑人又粗大| 黑丝美女一区二区| brazzers欧美精品| 91av成人在线| 国产对白videos麻豆高潮| 日韩av高清在线观看| 亚洲最新av在线网站| 久久福利毛片| 亚洲欧美中文在线视频| 一呦二呦三呦国产精品| 欧美手机在线| 99麻豆久久久国产精品免费优播| 中文字幕国产一区二区| 色鬼7777久久| 亚洲精品在线国产| 91国在线观看| 国产情侣呻吟对白高潮| 亚洲欧美自拍偷拍色图| 日韩精品一区二区三区视频播放| heyzo在线观看| 久久久久久亚洲综合影院红桃| 在线不卡一区二区| 亚洲不卡一卡2卡三卡4卡5卡精品| 亚洲午夜电影在线| 精品福利电影| 欧美精品久久久久久久久| 中文字幕日韩久久| 最近免费中文字幕大全免费第三页| 日韩一区二区免费视频| 天天操综合520| 国产成人综合视频| 日韩欧美精品一区二区三区经典| 神马久久久久久久久| 日日摸夜夜添夜夜添亚洲女人| 黄色成人在线网站| 日本中文字幕片| 在线观看中文字幕一区| 无码国产精品一区二区免费16| 成人黄色免费在线观看| 国产三级精品视频| 国产高清精品一区二区| 久久久男人的天堂| 女人18毛片水真多18精品| 精品在线一区二区三区| 日韩精品视频免费专区在线播放| 日本成人超碰在线观看| 日韩在线小视频| 天堂色在线视频| 国产日本精品视频| 免费高清在线观看电视| 天堂资源在线亚洲视频| 亚洲三区欧美一区国产二区| 久久精品99| 五月天丁香激情| 九九九伊在人线综合| 国产精品旅馆在线| a级片免费在线观看| 国产精品久久久一区二区三区| 久久久久国产免费| 午夜在线a亚洲v天堂网2018| 欧美人伦禁忌dvd放荡欲情| 欧美一区二区三区另类| 国产精品 欧美 日韩| 久久亚洲二区三区| 国偷自产av一区二区三区| 亚洲欧美国产另类首页| 亚洲无人区码一码二码三码的含义| 人妻少妇精品无码专区| 91精品国产乱码久久久久久久| 严阵以待中文社区| 国产在线拍偷自揄拍精品| 日日爱66.cn| 日韩禁在线播放| 99色这里只有精品| 韩国三级电影久久久久久| 午夜影院在线视频| 亚洲欧美日韩在线一区| 123区在线| 日韩欧美激情四射| www在线观看免费视频| 黄色资源在线看| 中文字幕欧美三区| 国产人成视频在线观看| 日本成人激情视频| 成a人片亚洲日本久久| 国产91精品欧美| 一区二区三区动漫| 国产男女猛烈无遮挡在线喷水| 国产偷久久久精品专区| 在线观看 中文字幕| 国产精品久久久久av蜜臀| 国产福利在线观看| 亚洲第一精品在线| 一道精品视频一区二区三区图片| 亚洲日本电影| 国产精品夜夜嗨| 国产三级电影| 麻豆精品国产免费| 老司机免费视频一区二区三区| 日韩av毛片网| 日本一卡二卡四卡精品| 日本最新一区二区三区视频观看| 欧美精品一区二区三区国产精品| 亚洲aaa在线观看| 亚洲青色在线| 男人透女人免费视频| 国产又粗又长又黄的视频| 午夜在线视频观看日韩17c| 98在线视频| a'aaa级片在线观看| 亚洲国产一成人久久精品| 日本久久一级片| 亚洲国产成人va在线观看麻豆| 久久九九久久九九| 国产精品91在线| 国产欧美一区二区精品久导航| 日韩国产高清影视| aa级大片免费在线观看| 国产日韩在线一区| 成人午夜视频一区二区播放| 中文一区二区在线观看| 久久99精品视频一区97| 欧美激情中文字幕乱码免费| 精品久久久久一区二区| 五月六月丁香婷婷| 综合网在线观看| 免费视频拗女稀缺一区二区| 午夜视频国产| 欧美一区二区三区四区在线| 性xx无遮挡| 成人精品一二三区| 一本色道88久久加勒比精品| 亚洲激精日韩激精欧美精品| 久久综合久久网| 久久亚洲春色中文字幕久久久| 免费看男男www网站入口在线| 亚洲一区色图| 资源av在线| 国产精品久久久久久久免费大片| 欧美激情精品久久久久久| 成人国产精品一区二区免费麻豆| 成人av中文| 一区二区三区免费观看| 亚洲乱码在线观看| 91麻豆精品国产91久久综合| 日本在线观看一区| 日本免费黄视频| 亚洲最新无码中文字幕久久| 欧美18—19性高清hd4k| 国产精品88a∨| 欧美日韩成人网| 精品在线欧美视频| 美女视频a黄免费| 精品成人在线观看| 91精品国产综合久久久久| 欧美aaa在线观看| 电影亚洲精品噜噜在线观看| 2020日本不卡一区二区视频| 国产一区二区免费在线观看| 欧美三级乱码| 四虎一区二区| 精品一卡二卡三卡四卡日本乱码| 91香蕉视频在线播放| 色综合色狠狠综合色| 激情综合婷婷| 久久se这里有精品| 成人乱码一区二区三区| 久久国产精品1区2区3区网页| 欧美日韩国产综合视频在线| 清纯唯美激情亚洲| 日本不卡高字幕在线2019| 色一情一交一乱一区二区三区| 激情五月深爱五月| 国产精品亚洲第一区| 国产精品久久久久久久久免费看| 美女裸体自慰在线观看| **网站欧美大片在线观看| 国产免费无遮挡吸奶头视频| 亚洲高清不卡一区| 欧美精品tushy高清| 亚洲天堂男人天堂女人天堂| 好吊色免费视频| 日本韩国欧美超级黄在线观看| 亚洲GV成人无码久久精品| 国产深夜精品| 国产乱淫av免费| 日韩少妇中文字幕| 欧美黑人巨大videos精品| 国内欧美视频一区二区| 亚洲伊人观看| 国产成人精品毛片| 91国视频在线| 一区二区成人| 国产精品欧美激情在线观看| 日韩欧美电影一区| 欧美三级午夜理伦三级| 少妇高潮大叫好爽喷水| 久久精品综合视频| 97在线观看免费观看| 成人a在线观看高清电影| 精品少妇一区二区三区在线播放| 一区二区欧美亚洲| 在线观看免费高清视频| 午夜少妇久久久久久久久| 国产一级大片免费看| 欧美极品jizzhd欧美| 国产精品网站大全| 亚洲成av人片一区二区梦乃| 99精品视频免费全部在线| 成人精品第一区二区三区| 国产一区二区福利| 成人美女在线视频| 日p在线观看| 国产97在线视频| 日韩激情视频在线播放| 丁香花在线高清完整版视频| 欧美做受69| 四虎影视永久免费观看| 免费三级网站| 三年中文高清在线观看第6集| 亚洲妇女屁股眼交7| 中文字幕日韩一区二区三区| 美女少妇全过程你懂的久久| 日韩高清国产一区在线| 青青草视频在线免费观看| 日韩精品一区二区三区免费观看| 两个人看的免费完整在线观看| 99精品视频免费看| 免费看日本毛片| 欧美精品一卡二卡| 成人性教育av免费网址| 2019天天操夜夜操| 欧美娇小极度另类| 精品一区二区三区日本| av黄色在线播放|