Python的iOS自動化打包

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

本公眾號內容均為本號轉PO,已盡可能註明出處。因未能核實來源或轉PO內容圖片有權利瑕疵的,請及時聯繫本號,本號會第一時間進行修改或刪除。 QQ : 3442093904

前言

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

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

原理

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

為什麼要做這個?

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

思路:

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

  1. 找到對應的項目

  2. clean項目

  3. archive項目

  4. export IPA

  5. 上傳蒲公英

  6. 發送郵件

  7. 收工

思路有了,動手起來.

運行環境

Python, Xcode

這些需要大家直接去搭建好環境…

準備工作

  1. 下載安裝pycharm(這只是我開發Python的工具而已,大家可以根據自己喜歡的來選擇)

  2. 註冊並認證蒲公英(不認證的話,是不能上傳的)

  3. 郵箱開啟POP3/SMTP服務(我使用的是QQ郵箱),記錄下16位授權碼

  4. 一個ExportOptions.plist文件, 這個下面會解釋為什麼需要還有怎麼生成!

  5. 一份iOS項目代碼→_→

完整代碼

#!/usr/bin/envpython3#-*-coding:utf-8-*-#@Time:2018/11/1411:04AM#@Author:liangk#@Site:#@File:auto_archive_ios.py#@Software:PyCharmimportosimportrequestsimportwebbrowserimportsubprocessimporttimeimportsmtplibfromemail.mime.textimportMIMETextfromemailimportencodersfromemail.headerimportHeaderfromemail.utilsimportparseaddr,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郵箱..classAutoArchive(object):"""自動打包並上傳到蒲公英,發郵件通知"""def__init__(self):passdefclean(self):print("\n\n===========開始clean操作===========")start=time.time()clean_command='xcodebuildclean-workspace%s/%s.xcworkspace-scheme%s-configurationRelease'%(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.returncodeifclean_result_code!=0:print("=======clean失敗,用時:%.2f秒======="%(end-start))else:print("=======clean成功,用時:%.2f秒======="%(end-start))self.archive()defarchive(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='xcodebuildarchive-workspace%s/%s.xcworkspace-scheme%s-configurationRelease-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.returncodeifarchive_result_code!=0:print("=======archive失敗,用時:%.2f秒======="%(end-start))else:print("=======archive成功,用時:%.2f秒======="%(end-start))#導出IPAself.export()defexport(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.returncodeifexport_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))defupload(self,ipa_path):print("\n\n===========開始上傳蒲公英操作===========")ifipa_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)ifr.status_code==200:#是否需要打開瀏覽器#self.open_browser(self)self.send_email()else:print("\n\n===========沒有找到對應的ipa===========")return@staticmethoddefopen_browser(self):webbrowser.open(ipa_download_url,new=1,autoraise=True)@staticmethoddef_format_address(self,s):name,address=parseaddr(s)returnformataddr((Header(name,'utf-8').encode(),address))defsend_email(self):#https://www.pgyer.com/XXXapp地址#只是單純的發了一個文本郵箱,具體的發附件和圖片大家可以自己去補充msg=MIMEText('

Hello

'+'

╮(╯_╰)╭應用已更新,請下載測試╮(╯_╰)╭

'+'

蒲公英的更新會有延遲,具體版本時間以郵件時間為準

'+'','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腳本代碼)。

具體的內容

<plistversion="1.0"><dict><key>compileBitcodekey>//是否編譯bitcode<true/><key>methodkey><string>ad-hocstring>/<key>provisioningProfileskey><dict><key>文件bundleidkey><string>Adhoc_IDstring>dict><key>signingCertificatekey>//證書簽名<string>這里填證書簽名string><key>signingStylekey><string>manualstring><key>stripSwiftSymbolskey><true/><key>teamIDkey><string>AANCCUK4M3string>//TeamID<key>thinningkey><string>string>dict>plist>

分析

xcodebuildarchive-workspaceXXX.xcworkspace-schemeXXX-configurationRelease-archivePathXXXCONFIGURATION_BUILD_DIR./dirODE_SIGN_IDENTITY=證書PROVISIONING_PROFILE=描述文件UUID

問題一

配置一下compileBicode=NO即可

感謝樹下敲代碼的超人

作者:lxiaok

鏈接:https://juejin.im/post/5bed3657518825604e0e4289

Python的iOS自動化打包 科技 第5張

About 尋夢園
尋夢園是台灣最大的聊天室及交友社群網站。 致力於發展能夠讓會員們彼此互動、盡情分享自我的平台。 擁有數百間不同的聊天室 ,讓您隨時隨地都能找到志同道合的好友!