前言
這段時間剛剛學習了一段時間的Python,加上自己是做iOS開發的,就想著用Python來做一個自動化打包,可以自動完成打包,上傳到蒲公英,并且發送郵箱給測試人員.
一是可以減少打包功夫,二來可以練練手,結合自己的工作來輸出一點東西.廢話不多說,直接上代碼...
原理
就是使用xcodebuild來控制Xcode進行一系列的操作,從而完成打包的操作.
為什么要做這個?
在我們日常開發的時候,特別是在內部測試的時間,有可能需要頻繁的打包,打包的工作比較繁瑣,需要等待點擊下一步,選擇之類,影響了開發的節奏.(開玩笑,我能有啥節奏...), 為什么不能直接運行,然后完成所有的操作呢?
思路:
從網上查找了一些關于xcodebuild來打包的資料,從而得到:
思路有了,動手起來.
運行環境
Python, Xcode
這些需要大家直接去搭建好環境...
準備工作
完整代碼
#!/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等文件,可以使用改字段指定輸出路徑。 |
問題一
配置一下compileBicode=NO即可
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。
新聞熱點
疑難解答