需要什么
- XCode編譯環(huán)境:用于編譯iOS應(yīng)用程序
- openssl環(huán)境(用于生成自簽SSL證書)
- HTML分發(fā)網(wǎng)頁(本文附相應(yīng)文件鏈接,可以直接下載部署)
- nginx環(huán)境:用于配置http和https服務(wù)
- Jenkins 用于持續(xù)集成(遠(yuǎn)程構(gòu)建)
- 可用于分發(fā)的iOS證書簽名(如:adhoc簽名,appstore簽名)
- 本地git環(huán)境和遠(yuǎn)程git倉庫(用于代碼托管和持續(xù)集成代碼拉蠕剔帧)
創(chuàng)建App
使用XCode創(chuàng)建一個(gè)iOS應(yīng)用工程,命名App1
模暗。這里我們以Swift語言創(chuàng)建該工程。
我們將要對(duì)項(xiàng)目配置三個(gè)運(yùn)行環(huán)境(Objective-C配置環(huán)境變量有稍許差異)念祭,分別如下:
名稱 | 環(huán)境 |
---|---|
DEV | 開發(fā)環(huán)境 |
UAT | 預(yù)發(fā)布環(huán)境 |
PROD | 生產(chǎn)環(huán)境 |
接下來使用CocoaPods對(duì)工程進(jìn)行管理兑宇。
打開終端,進(jìn)入到工程目錄棒卷,執(zhí)行pod init
和pod install
顾孽。如下圖:
為了讓應(yīng)用在分發(fā)時(shí)可以構(gòu)建多個(gè)渠道的安裝包,這里我們可以對(duì)它的環(huán)境進(jìn)行參數(shù)化配置比规。
打開工程的xcworkspace
文件若厚,現(xiàn)在我們要對(duì)工程配置2個(gè)Scheme
,創(chuàng)建完成后加上原有的Scheme總計(jì)3個(gè)蜒什。
創(chuàng)建好的Sheme列表如下:
在原有的兩個(gè)Build configuration
基礎(chǔ)上再創(chuàng)建4個(gè)测秸,分別讓Debug
和 Release
對(duì)應(yīng)DEV
和UAT
環(huán)境。
為了讓App變得完整接下來配置項(xiàng)目的圖標(biāo)信息。
接下來關(guān)聯(lián)Sheme和Build Configuraion(Debug和Release兩種情況)霎冯。
對(duì)應(yīng)關(guān)系如表所示:
Scheme | Debug | Release |
---|---|---|
App1 | Debug | Release |
App1_DEV | Debug_DEV | Release_DEV |
App1_UAT | Debug_UAT | Release_UAT |
效果如下:
接著在項(xiàng)目工程中配置環(huán)境變量铃拇,如圖所示:
Build configuration | 環(huán)境變量 |
---|---|
Debug | DEBUG |
Debug_DEV | DEBUG ENVIOMENT_DEV |
Debug_UAT | DEBUG ENVIOMENT_UAT |
Release | |
Release_DEV | ENVIOMENT_DEV |
Debug | ENVIOMENT_UAT |
然后就可以在代碼中加入環(huán)境變量判斷來控制源碼編譯實(shí)現(xiàn)不同環(huán)境的App的差異配置。
這里我們?cè)诓煌h(huán)境下分別讓App首頁背景為不同顏色
環(huán)境 | 首頁背景色 |
---|---|
DEV | 紅 |
UAT | 綠 |
PROD | 藍(lán) |
首頁使用環(huán)境變量來控制預(yù)編譯沈撞。源碼如下:
#if ENVIROMENT_DEV
view.backgroundColor = .red
enviromentLabel.text = "DEV"
#elseif ENVIROMENT_UAT
view.backgroundColor = .green
enviromentLabel.text = "UAT"
#else
view.backgroundColor = .blue
enviromentLabel.text = "PROD"
#endif
例如:將Sheme選擇為App_UAT慷荔,編譯運(yùn)行,即可看到設(shè)備上運(yùn)行的App首頁被金色變成了綠色缠俺,說明環(huán)境變量關(guān)聯(lián)Scheme已經(jīng)生效显晶。
頁面展示效果:
顯然,通過選擇不同的Sheme來關(guān)聯(lián)環(huán)境變量還可以做更多的操作壹士,比如網(wǎng)絡(luò)接口地址等磷雇。
工程倉庫已經(jīng)上傳到GitHub,可以下載參考躏救。
使用XCode自帶的Archive工具分發(fā)App
更改應(yīng)用的版本相關(guān)信息
選著指定的Scheme執(zhí)行歸檔唯笙,注意設(shè)備要選擇Any iOS Device
。
備份ExportOptions.plist到iOS_Distribution呢堰,重命名為ExportOptions_adhoc.plist
分發(fā)應(yīng)用時(shí)涉及到證書配置、簽名惹资、和分發(fā)途徑的相關(guān)信息褪测,先使用Archive工具通過adhoc途徑分發(fā)一次adhoc猴誊,獲取ExportOptions.plist
文件并備份。此處不細(xì)說侮措,若有不熟之處懈叹,可上互聯(lián)網(wǎng)搜索相關(guān)資料。
導(dǎo)入分發(fā)網(wǎng)頁
將之前已經(jīng)編寫好的Web網(wǎng)頁導(dǎo)入指定目錄分扎,這里我們指定/Users/chenbo/DAPP
為Web服務(wù)根目錄澄成。Web網(wǎng)頁的文件結(jié)構(gòu)如下:
/Users/chenbo/DAPP
├── detail.html
├── index.html
└── source
├── qrcode.min.js
├── reset.css
├── style.css
└── vue.global.prod.js
1 directory, 6 files
分發(fā)網(wǎng)頁Git倉庫地址:https://github.com/cba023/iOS_DistributionAssets.git
生成自簽SSL證書
首先獲取本機(jī)IP地址方便項(xiàng)目的配置與部署。Mac上查看IP地址非常簡(jiǎn)單,可在系統(tǒng)偏好設(shè)置
->網(wǎng)絡(luò)
中可以查看墨状。
創(chuàng)建公私鑰文件夾
mkdir -p /usr/local/etc/ssl/private
mkdir -p /usr/local/etc/ssl/certs
創(chuàng)建秘鑰和證書
sudo openssl req \
-x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /usr/local/etc/ssl/private/self-signed.key \
-out /usr/local/etc/ssl/certs/self-signed.crt
輸入指定后需要填寫證書的一些信息卫漫,Common Name
需要填寫為自定義的域名,這里我把它設(shè)成了本機(jī)的IP地址肾砂。
然后打開/usr/local/etc/ssl
目錄列赎,private
和certs
文件夾分別生成了私鑰和證書。
/Users/chenbo/DAPP
目錄下創(chuàng)建一個(gè)ssl
子目錄镐确,再把self-signed.crt
拷貝一份到ssl
中包吝,用于分發(fā)網(wǎng)頁中的SSL證書下載。
安裝和使用nginx
安裝nginx
安裝nginx有多種方式辫塌,這里我們使用brew來安裝漏策,如果你的Mac上沒有安裝brew環(huán)境,可以去網(wǎng)上了解下brew的安裝教程臼氨。
執(zhí)行以下指令掺喻,brew會(huì)自動(dòng)安裝nginx:
brew install nginx
安裝完成后在終端輸入:
nginx -version
如果顯示了nginx版本即表示已經(jīng)安裝成功。
配置nginx的http和https服務(wù)
由于蘋果官方要求分發(fā)應(yīng)用必須使用https協(xié)議储矩,而我們自己搭建服務(wù)使用了自簽證書感耙,需要先使用http服務(wù)下載證書后才能正常使用https服務(wù),所以這里我們同時(shí)配置http和https服務(wù)持隧。
使用訪達(dá)打開/usr/local/etc/nginx
目錄即硼,編輯nginx.conf
文件。如下:
server {
listen 80;
listen 443 ssl;
server_name localhost;
# ssl on;
# location of ssl certificate
ssl_certificate /usr/local/etc/ssl/certs/self-signed.crt;
# location of ssl key
ssl_certificate_key /usr/local/etc/ssl/private/self-signed.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /Users/chenbo/DAPP;
index index.html index.htm;
}
}
上述配置開啟了80和443端口屡拨,即開啟了http和https服務(wù)只酥, ssl_certificate和ssl_certificate_key分別對(duì)應(yīng)的自簽名證書和私鑰的路徑,和openssl生成的路徑保持一致呀狼。
這里有一點(diǎn)要注意裂允,/Users/chenbo/DAPP
是我設(shè)定的nginx服務(wù)根目錄,該目錄和上一小節(jié)中的HTML存放路徑保持一致哥艇。
接下來就可以啟動(dòng)nginx服務(wù)了绝编。
brew services start nginx
如下圖所示,nginx成功啟動(dòng)貌踏。
打開Mac的系統(tǒng)偏好設(shè)置
->安全與隱私
->防火墻
->關(guān)閉
十饥,即關(guān)閉Mac的防火墻。
接著在瀏覽器中打開我們之前設(shè)定的服務(wù)地址祖乳。
http://192.168.0.103
配置iOS應(yīng)用分發(fā)Shell腳本
Shell腳本下載地址:https://github.com/cba023/iOS_DistributionAssets.git
把iOS_Distribution
目錄拷貝到用戶文件夾逗堵。
/Users/chenbo/iOS_Distribution
├── AutoSh
│ ├── ExportOptions_adhoc.plist
│ └── distribute.sh
└── Others
├── base.plist
└── blank.plist
2 directories, 4 files
ExportOptions_adhoc.plist
是之前使用XCode打包時(shí)生成的ExportOptions.plist
重命名而來,包含了項(xiàng)目的構(gòu)建信息凡资。-
distribute.sh
文件需做稍許更改-
__APP_NAME="APP1"
# 應(yīng)用的名稱這里固定 -
__HOST="192.168.0.103"
# Host指定為nginx服務(wù)的IP地址
-
-
Other目錄下有兩個(gè)plist文件砸捏,后面在腳本運(yùn)行時(shí)能調(diào)用到谬运,請(qǐng)不要自行修改文件內(nèi)容
- blank.plist: 空屬性列表文件,用于腳本執(zhí)行寫入分發(fā)記錄信息
- base.plist: 用于寫入App遠(yuǎn)程安裝時(shí)的遠(yuǎn)程配置信息
檢查完善DAPP目錄的文件與配置
DAPP即/Users/chenbo/DAPP
目錄垦藏,從上文已經(jīng)得知在DAPP中已經(jīng)包含了下列文件:
-
分發(fā)網(wǎng)頁
相關(guān)文件 -
ssl
證書文件
在DAPP中創(chuàng)建images目錄梆暖,并導(dǎo)入應(yīng)用分發(fā)時(shí)要用到的兩個(gè)尺寸的Logo文件,格式png。
文件名 | 分辨率 |
---|---|
image_57x57.png | 57 * 57 |
image_512x512.png | 512 * 512 |
導(dǎo)入后DAPP目錄內(nèi)容如下:
現(xiàn)在就可以通過腳本來構(gòu)建分發(fā)應(yīng)用了。
使用Shell直接構(gòu)建App并分發(fā)
把iOS_Distribution目錄下的AutoSh目錄拷貝到App1的工程根目錄铣墨,然后使用終端打開工程根目錄下的AutoSh,執(zhí)行:
sh distribute.sh -h
可以看到:
終端顯示了腳本的使用方法级解,這里我們執(zhí)行下列指令:
sh distribute.sh -b Release -s App1 -u "修復(fù)問題若干;優(yōu)化性能若干田绑;增加功能若干勤哗;XXX xx,XXX_XX"
執(zhí)行,如下圖所示掩驱,終端窗口自動(dòng)將更更新內(nèi)容顯示出來了芒划,并展示了更多的日志信息。
直到構(gòu)建完成欧穴。
此時(shí)我們打開分發(fā)的網(wǎng)頁地址民逼,發(fā)現(xiàn)歷史版本中多了一項(xiàng)記錄,即剛才構(gòu)建的項(xiàng)目涮帘。
嘗試更改App1工程內(nèi)的版本信息拼苍,再次執(zhí)行分發(fā)指令,并嘗試更改工程的Scheme為App1_DEV或App1:
- 分發(fā)DEV環(huán)境的包
sh distribute.sh -b Release_DEV -s App1_DEV -u "版本改 為1.0.1调缨;"
- 分發(fā)UAT環(huán)境的包
sh distribute.sh -b Release_UAT -s App1_UAT -u "UAT疮鲫;"
分發(fā)的網(wǎng)頁地址多了兩條記錄,而且篩選菜單也有了多種選項(xiàng)可以篩選版本號(hào)和構(gòu)建類型弦叶。
我們點(diǎn)擊一條記錄棚点。
即跳轉(zhuǎn)到了單次分發(fā)的詳情頁,該頁面真實(shí)了APP1本次構(gòu)建的詳細(xì)信息湾蔓,包括構(gòu)建的一些參數(shù)和更新內(nèi)容。
如果手機(jī)和構(gòu)建的Mac主機(jī)是處于一個(gè)局域網(wǎng)內(nèi)且Mac主機(jī)關(guān)機(jī)了防火墻砌梆,則可以實(shí)現(xiàn)掃碼安裝該應(yīng)用包(保證當(dāng)前簽名已經(jīng)錄入了安裝手機(jī)的UDID情況方能使用)默责。
手機(jī)掃碼后Safari瀏覽器打開分發(fā)詳情頁,首次安裝App前需要點(diǎn)擊頁面左下角的安裝SSL
證書(描述文件)咸包,并去手機(jī)設(shè)置
->通用
->關(guān)于本機(jī)
中信任該描述文件桃序,然再點(diǎn)擊點(diǎn)擊安裝
字樣按鈕。
然后就自動(dòng)安裝到手機(jī)上了烂瘫。
使用Jenkins來管理應(yīng)用分發(fā)
Jenkins安裝教程:https://gitee.com/jenkins-zh 或 https://www.jenkins.io 媒熊。
Jenkins安裝好后需要配置環(huán)境變量才能保證可以調(diào)用Shell中的指令奇适,可進(jìn)入Jenkins系統(tǒng)管理
->系統(tǒng)配置
->全局屬性
->環(huán)境變量
中配置PATH
,PATH內(nèi)容可以從Mac終端中輸入echo $PATH
打印的內(nèi)容拷貝過來芦鳍。
Jenkins中配置的Shell嚷往,可以實(shí)現(xiàn)Jenkins參數(shù)化運(yùn)行。
#!/bin/bash
export LANG="en_US.UTF-8"
if [[ ${SCHEME} == "App1_DEV" ]]; then
__BUILD_CONF="Release_DEV"
elif [[ ${SCHEME} == "App1_UAT" ]]; then
__BUILD_CONF="Release_UAT"
else
__BUILD_CONF="Release"
fi
__UPDATES=${UPDATES}
echo "__UPDATES:${__UPDATES}"
__UPDATES_LENGTH=${#__UPDATES}
if [[ ${__UPDATES_LENGTH} -lt 1 ]]; then
__UPDATES=$(git log --format=%B -n 1 HEAD)
fi
echo "Jenkins -> SCHEME: ${SCHEME}, __BUILD_CONF: ${__BUILD_CONF}"
cp -rf /Users/`whoami`/iOS_Distribution/AutoSh/ ${WORKSPACE}/AutoSh/
cd ${WORKSPACE}/AutoSh/
sh ${WORKSPACE}/AutoSh/distribute.sh -a ${DOWNLOAD_HOST} -s ${SCHEME} -b ${__BUILD_CONF} -u "${__UPDATES}"
點(diǎn)擊保存柠衅。
參數(shù)化構(gòu)建皮仁。
設(shè)定構(gòu)建的參數(shù)。
開始構(gòu)建后可以看到構(gòu)建進(jìn)度菲宴。
可從構(gòu)建任務(wù)重選擇查看控制臺(tái)輸出的日志贷祈。
日志顯示任務(wù)完成。
構(gòu)建成功喝峦,然后進(jìn)入分發(fā)網(wǎng)頁势誊,即看到分發(fā)記錄里又多了一條記錄。接著就可以使用逸動(dòng)設(shè)備掃碼安裝應(yīng)用了谣蠢。