国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-01-04 14:00:27
字體:
來源:轉載
供稿:網友

前言

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

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

原理

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

Python,iOS,自動化打包,代碼

為什么要做這個?

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

思路:

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

  1. 找到對應的項目
  2. clean項目
  3. archive項目
  4. export IPA
  5. 上傳蒲公英
  6. 發送郵件
  7. 收工

思路有了,動手起來.

運行環境

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()

關于ExportOptions.plist文件

因為 Xcode 9+ 默認不允許訪問鑰匙串的內容,必須要設置 allowProvisioningUpdates 才會允許,Python的Xcode插件目前無法支持此項完成打包流程。

解決步驟如下:

1、手動Xcode10打包,導出ExportOptions.plist文件;

2、編輯ExportOptions.plist文件,配置 provisioningProfiles 對應填入Bundle identifier及證書關聯配置文件(打包時自動匹配或手動填入證書,provisioningProfiles需配置的必填信息可自動生成);

3、提供ExportOptions.plist文件路徑供Python腳本調用(詳請參看Python腳本代碼)。

具體的內容

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>compileBitcode</key>//是否編譯bitcode<true/><key>method</key><string>ad-hoc</string>/<key>provisioningProfiles</key><dict><key>文件bundle id</key><string>Adhoc_ID</string></dict><key>signingCertificate</key>//證書簽名<string>這里填證書簽名</string><key>signingStyle</key><string>manual</string><key>stripSwiftSymbols</key><true/><key>teamID</key><string>AANCCUK4M3</string>//TeamID<key>thinning</key><string><none></string></dict></plist>

分析

xcodebuild archive -workspace XXX.xcworkspace -scheme XXX -configuration Release -archivePath XXX CONFIGURATION_BUILD_DIR ./dir ODE_SIGN_IDENTITY=證書 PROVISIONING_PROFILE=描述文件UUID

文件 說明
-workspace XXX.xcworkspace XXX.xcworkspace需要編譯工程的工作空間名稱,如果工程不是.xcworkspace的,可以不需要-workspace XXX.xcworkspace這段話
-scheme XXX XXX是工程名稱,-scheme XXX是指定構建工程的名稱
-configuration Release 填入打包的方式是Debug或Release,就跟在Xcode中編譯前需要在Edit scheme的Build configuration中選擇打出來的包是Debug還是Release包一樣,-configuration就是配置編譯的Build configuration
-archivePath XXX 配置生成.xcarchive的路徑,
ODE_SIGN_IDENTITY=證書 配置打包的指定證書,如果該工程的Xcode已經配置好了證書,那么不加入這段話也可以,打包出來的證書就是Xcode中配置好的。
PROVISIONING_PROFILE=描述文件UUID 配置打包的描述文件,同上,Xcode已經配置好了就不用在填入這段話了
CONFIGURATION_BUILD_DIR 配置編譯文件的輸出路徑,如果需要用到.xcarchive文件內部的dSYM等文件,可以使用改字段指定輸出路徑。

 

問題一

Python,iOS,自動化打包,代碼

配置一下compileBicode=NO即可

Python,iOS,自動化打包,代碼

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 铜山县| 长岛县| 措美县| 绿春县| 郯城县| 永城市| 泰州市| 木里| 十堰市| 泊头市| 麻城市| 麦盖提县| 商水县| 彝良县| 阳曲县| 汾阳市| 方山县| 广元市| 泸西县| 桦甸市| 普陀区| 开鲁县| 宕昌县| 滁州市| 哈巴河县| 隆安县| 镇赉县| 浠水县| 尚义县| 新田县| 海兴县| 潼关县| 广宗县| 长沙县| 兴仁县| 东乡族自治县| 蓬安县| 凉城县| 卢氏县| 青河县| 唐河县|