我是一名測(cè)試惋嚎,所以編碼能力有限予权,在大家看代碼的過程中,若發(fā)現(xiàn)問題或者建議請(qǐng)及時(shí)指出脂凶,或者直接在 GitHub 提交代碼
寫此文檔的初衷宪睹,因?yàn)閮赡昵熬蛯戇^ iOS 打包腳本,后來去做提升效能的測(cè)試工具的開發(fā)蚕钦,就不在關(guān)注前端的知識(shí)了亭病,現(xiàn)在
又要測(cè)試前端的業(yè)務(wù),但是之前的打包不能通用嘶居,所以自己就重新整理了一套通用的打包腳本與大家分享一下
摘要:本文主要介紹 iOS 打包腳本所必須的配置罪帖,及注意事項(xiàng)。腳本中不涉及第三方打包工具邮屁,如:
fastlane
整袁,或者第三方應(yīng)用分發(fā) 平臺(tái),如:fir.im佑吝。完全是基于Apple
官方提供的xcodebuild
編譯打包芋忿,通過itms-services
分發(fā)應(yīng)用戈钢,以及通過altool
將ipa
上傳至iTunes Connecnt
。
- 針對(duì)配置 iOS 持續(xù)集成分為兩個(gè)部分
- iOS 持續(xù)集成打包腳本 ?
- Jenkins + iOS 持續(xù)集成配置
項(xiàng)目
- 項(xiàng)目名稱:iOS-CI-Script
- 前提:
- 使用此項(xiàng)目進(jìn)行持續(xù)集成,項(xiàng)目中的證書管理必須采用手動(dòng)管理的方式
- 項(xiàng)目須使用
Cocopods
管理第三方模塊(如不符合此條抖所,可以自行調(diào)整xcodebuild
打包命令即可)
Tip:此項(xiàng)目主要針對(duì)持續(xù)集成田轧,如:Jenkins 或 GItLab CI 使用鞍恢,若想在本地直接運(yùn)行,需要進(jìn)行微調(diào)
- 能做什么窒典?瀑志?污秆?
- 打包之前修改 APP 名稱(
CFBundleDisplayName
)、版本號(hào)(CFBundleShortVersionString
)及構(gòu)建號(hào)(CFBundleVersion
) - 可以結(jié)合 Jenkins 選擇
Configuration
的打包類型战得,選擇你需要構(gòu)建的類型庸推,如:Debug
贬媒、Enterprise
、Release
等等 - 結(jié)合 Jenkins 或 GitLab CI 實(shí)現(xiàn)應(yīng)用分發(fā)杀捻,無需依賴第三方平臺(tái)
- 結(jié)合 Jenkins 或 GitLab CI 將
ipa
自動(dòng)上傳 iTunes Connect,并發(fā)布 TestFlight 內(nèi)測(cè)
Tip:無論各位所在的公司中有多少個(gè)開發(fā)項(xiàng)目或者馬甲包器赞,使用此腳本港柜,只需一個(gè)配置文件即可輕松搞定持續(xù)集成哦
- 打包之前修改 APP 名稱(
運(yùn)行環(huán)境
-
Python 3.5
及以上(Mac 安裝:brew install python3
) xcodebuild
-
xcpretty
(安裝方式:gem install xcpretty
夏醉,RubyGems 安裝請(qǐng)點(diǎn)擊鏈接畔柔,這里就不再贅述)
Tip:腳本運(yùn)行所需第三方模塊靶擦,見項(xiàng)目根目錄下的Pipfile
文件內(nèi)容
運(yùn)行方式
python3 ci.py
目錄結(jié)構(gòu)
├── Pipfile // pipenv 安裝依賴庫的配置文件
├── README.md // 使用說明文件
├── ci.py // 入口文件
├── modify_plist.py // 修改項(xiàng)目中的 APP 配置文件,及腳本中打包依賴的 plist 文件
├── compile.py // xcodebuild 打包相關(guān)的配置踩蔚,包含:clean枚粘、archive馅闽、export ipa馍迄、zip dSYM
├── archive.py // 處理 Jenkins 歸檔的相關(guān)操作捞蛋,詳情請(qǐng)看代碼注釋
├── configurations // 此目錄存放 app 的配置信息文件(支持多個(gè) APP 打包配置文件柬姚,在 `Jenkins + iOS 持續(xù)集成配置` 會(huì)進(jìn)行持續(xù)集成配置講解)拟杉,詳情請(qǐng)看下面文件的介紹信息
│ └── example.plist // 配置文件模板
├── libs // 此目錄存在一些工具里及環(huán)境變量文件
│ ├── __init__.py
│ ├── configuration.py // 初始化配置類
│ ├── env_enum.py // 存在環(huán)境變量文件
│ ├── html_tools.py // html 解析類(目前暫未使用)
│ ├── make_qr_code.py // 生成二維碼函數(shù)
│ └── plist_operation.py // 操作 plist 工具類
├── plist // 存在 exportOption 配置文件
│ ├── ad-hoc.plist
│ ├── app-store.plist
│ ├── development.plist
│ ├── enterprise.plist
│ └── itms-services.plist // 此文件的作用是分發(fā)應(yīng)用量承,與打包無關(guān)
└── static // 存放靜態(tài)資源文件
├── html // 存放 html web 靜態(tài)頁面的目錄搬设,在 `Jenkins + iOS 持續(xù)集成配置` 這篇中會(huì)進(jìn)行演示
└── icon // 存在 app icon 的目錄
使用說明
基礎(chǔ)參數(shù)配置
# 編輯 `lib` 目錄下的 `env_num` 變量文件
# 需手動(dòng)更改的參數(shù)(選擇默認(rèn)也可以)
DIST_CONFIGURATION_NAME = 'Release'
ARCHIVE_DIR_NAME = 'Products'
SCRIPT_DIR_NAME = 'scripts'
WORKSPACE_URL = f'{BUILD_URL}execution/node/3/ws/'
- 變量說明
-
DIST_CONFIGURATION_NAME
:項(xiàng)目中配置發(fā)布證書的configuration
的名稱 -
ARCHIVE_DIR_NAME
:Jenkins 配置歸檔的目錄名稱,此目錄是被創(chuàng)建在代碼的根目錄 -
SCRIPT_DIR_NAME
:存在腳本項(xiàng)目的目錄名稱撕捍,也是在項(xiàng)目的根目錄下 -
WORKSPACE_URL
:此 URL 是通過 Jenkins 的 Web 頁面上訪問的WORKSPACE
的 URL(必須修改)
-
iTunes Connect 參數(shù)配置
# 編輯 `lib` 目錄下的 `env_num` 變量文件
# iTunes Connect 配置
UPLOAD_ITUNES_CONNECT = os.getenv('UPLOAD_ITUNES_CONNECT', 'false')
ITC_USER = os.getenv('ITC_USER', None)
ITC_PASSWORD = os.getenv('ITC_PASSWORD', None)
- 變量說明
-
UPLOAD_ITUNES_CONNECT
:上傳 iTunes Connect(發(fā)布 TestFlight 內(nèi)測(cè))拿穴,默認(rèn)false
不上傳 -
ITC_USER
:開發(fā)者賬號(hào)用戶名 -
ITC_PASSWORD
:開發(fā)者賬號(hào)密碼(若 Apple 賬號(hào)已開啟雙重認(rèn)證忧风,請(qǐng)生成并使用專用密碼)
注:為了安全起見,不建議將開發(fā)者賬號(hào)的用戶名和密碼寫死在腳本或則環(huán)境系統(tǒng)的環(huán)境變量中腿宰,個(gè)人建議寫在 Jenkins 的 JOB 中,針對(duì)此 JOB 做權(quán)限控制即可
-
APP 配置文件參數(shù)講解
example.plist
- 配置文件參數(shù)說明
-
appName
:應(yīng)用名稱 -
workspace
:app workspace(注:如果無workspace
椿每,就需要修改compile.py
文件的中打包命令英遭,針對(duì)目前大部分項(xiàng)目都是用Cocopods
管理依賴庫的挖诸,所以目前未對(duì)未使用workspace
的項(xiàng)目兼容) -
scheme
:scheme (嗯.....不好描述汁尺,如果對(duì)workspace
、scheme
不理解的税灌,請(qǐng)點(diǎn)擊 這里)- 注:在項(xiàng)目中必須將此
scheme
設(shè)置為shared
- 注:在項(xiàng)目中必須將此
-
iconPath
:存在static/icon
目錄下的icon
-
icon
規(guī)格:推薦 128 * 128 或 144 * 144(大小適中即可)
Tip:這是用于生成二維碼時(shí)均函,給中間增加圖標(biāo)用的亿虽,如果圖片不合法會(huì)報(bào)錯(cuò),所以需要讓 UE 或者 RD 把這個(gè)icon
給你
-
-
plistPaths
:配置自代碼根目錄下的info.plist
文件的相對(duì)路徑苞也,主要包括:項(xiàng)目及 Extension 中的info.plist
文件路徑(注:和 APP 不相關(guān)的info.plist
無需配置) -
Debug
洛勉、AdHoc
、Release
如迟、Enterprise
收毫,這幾個(gè)都是項(xiàng)目中Configuration
的名稱,由于配置都是一樣的殷勘,所以就Debug
進(jìn)行說明此再,如下??-
method
:此參數(shù)的值有四種類型:app-store, ad-hoc, enterprise or development
詳情請(qǐng)查看 Xcode Archive: export options 此文檔 -
teamID
:開發(fā)者賬號(hào)的ID
,獲取方式:登錄開發(fā)者賬號(hào) → 點(diǎn)擊Team Name
→ 選擇View Account
玲销,然后在頁面中找到Team ID
即可 -
bundleID
:就是 APP 的唯一標(biāo)識(shí)输拇,如:com.companyName.porjectName
-
provisioningProfiles
:此配置參數(shù)是字典類型key: value
-
key
的值為bundleID
-
value
的值為buildID
所對(duì)應(yīng)的描述文件(Provisioning Profile)的名稱
注:項(xiàng)目中涉及到所有的bundleID
都必須要用key: value
的形式寫在這里,例如:除了項(xiàng)目的bundleID
和 NotificationServiceExtension(如果 APP 不涉及推送贤斜,請(qǐng)忽略) 的bundleID
這兩個(gè)策吠,可能還有自定義的Extension
的bundleID
-
-
-
其它
itms-services(了解即可)
通過 itms-services 協(xié)議,發(fā)布或者分享 iOS 應(yīng)用程序?qū)ёx:itms-services 協(xié)議常用于 iOS 企業(yè)應(yīng)用的無線部署瘩绒,這可在不使用 iTunes 的情況下將內(nèi)部軟件發(fā)布或者分享給用戶猴抹。
- 實(shí)現(xiàn)原理
OTA 方式安裝,是通過 Safari 解析鏈接中的 "itms-services://" 來實(shí)現(xiàn)的锁荔。
例如:
<a title="iPhone" href="itms-services://?action=download-manifest&url=https://github.com/NAISI-ZC/iOS-CI-Script/blob/master/plist/itms-services.plist">
安裝應(yīng)用
</a>
Safari 會(huì)去讀取 itms-services.plist 中的信息蟀给,如:iOS 應(yīng)用的名稱、版本阳堕、安裝地址等跋理。
什么是 OTA?嘱丢?薪介?
OTA 即 Over-the-Air,是 Apple 在 iOS 4 中新加的一項(xiàng)技術(shù)越驻,目的是讓開發(fā)者能夠脫離 Appstore,實(shí)現(xiàn)從自己的服務(wù)器下載并安裝 iOS 應(yīng)用道偷。
簡單地說缀旁,就是用戶只需要在 Safari 中點(diǎn)開一條鏈接,就能直接在主界面中安裝 APP
- 注意事項(xiàng)
- itms-services 協(xié)議拼接的 URL 必須是 HTTPS 服務(wù)
- HTTPS 無須暴露在公網(wǎng)下勺鸦,只要保證是可信的證書即可(自簽名證書生成并巍,個(gè)人沒做過,所以不做斷言换途。個(gè)人覺得關(guān)于證書問題直接找運(yùn)維解決就可以了)
配置持續(xù)集成請(qǐng)查看 Jenkins + iOS 持續(xù)集成配置