亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python中iOS自動化打包的示例分析

發布時間:2021-07-22 11:03:10 來源:億速云 閱讀:208 作者:小新 欄目:開發技術

小編給大家分享一下Python中iOS自動化打包的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

原理

就是使用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: PyCharm


import os
import requests
import webbrowser
import subprocess
import time
import smtplib
from email.mime.text import MIMEText
from email import encoders
from email.header import Header
from email.utils import parseaddr, formataddr

project_name = 'TestArchive' # 項目名稱
archive_workspace_path = '/Users/用戶/Desktop/TestArchive' # 項目路徑
export_directory = 'archive' # 輸出的文件夾
ipa_download_url = 'https://www.pgyer.com/XXX' #蒲公英的APP地址

# 蒲公英賬號USER_KEY、API_KEY
USER_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):
pass

def 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.returncode
if 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.returncode
if archive_result_code != 0:
print("=======archive失敗,用時:%.2f秒=======" % (end - start))
else:
print("=======archive成功,用時:%.2f秒=======" % (end - start))
# 導出IPA
self.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.returncode
if 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

@staticmethod
def open_browser(self):
webbrowser.open(ipa_download_url, new=1, autoraise=True)

@staticmethod
def _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><h2>Hello</h2>' +
'<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協議默認端口是25
server.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>&lt;none&gt;</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.xcworkspaceXXX.xcworkspace需要編譯工程的工作空間名稱,如果工程不是.xcworkspace的,可以不需要-workspace XXX.xcworkspace這段話
-scheme XXXXXX是工程名稱,-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自動化打包的示例分析

以上是“Python中iOS自動化打包的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

苏尼特右旗| 清远市| 峡江县| 泽库县| 棋牌| 梁平县| 石渠县| 长兴县| 横山县| 赣州市| 文成县| 巴南区| 苏尼特右旗| 卫辉市| 盐亭县| 莎车县| 霸州市| 大余县| 威海市| 偃师市| 永德县| 剑河县| 正宁县| 哈巴河县| 大名县| 康保县| 顺平县| 吴忠市| 和静县| 贵阳市| 佛山市| 大连市| 保康县| 南华县| 瑞昌市| 永清县| 惠来县| 定州市| 桂阳县| 靖远县| 墨玉县|