自建iOS內(nèi)測(cè)分發(fā)平臺(tái)

原文參見:https://cba023.github.io

需要什么

  • 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)境
創(chuàng)建一個(gè)Swift工程取名為App1

接下來使用CocoaPods對(duì)工程進(jìn)行管理兑宇。
打開終端,進(jìn)入到工程目錄棒卷,執(zhí)行pod initpod install顾孽。如下圖:

使用CocoaPods管理項(xiàng)目

為了讓應(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)建多個(gè)Scheme

創(chuàng)建好的Sheme列表如下:

創(chuàng)建好Sheme的效果

在原有的兩個(gè)Build configuration基礎(chǔ)上再創(chuàng)建4個(gè)测秸,分別讓DebugRelease對(duì)應(yīng)DEVUAT環(huán)境。

創(chuàng)建多個(gè)Build configuration

為了讓App變得完整接下來配置項(xiàng)目的圖標(biāo)信息。

配置項(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

效果如下:

關(guān)聯(lián)Scheme和Build configuration

接著在項(xiàng)目工程中配置環(huán)境變量铃拇,如圖所示:

配置環(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選擇為App_UAT

頁面展示效果:

運(yùn)行效果

顯然,通過選擇不同的Sheme來關(guān)聯(lián)環(huán)境變量還可以做更多的操作壹士,比如網(wǎng)絡(luò)接口地址等磷雇。

工程倉庫已經(jīng)上傳到GitHub,可以下載參考躏救。

倉庫地址:https://github.com/cba023/App1.git

使用XCode自帶的Archive工具分發(fā)App

更改應(yīng)用的版本相關(guān)信息

更改應(yīng)用的版本相關(guān)信息

選著指定的Scheme執(zhí)行歸檔唯笙,注意設(shè)備要選擇Any iOS Device

歸檔
歸檔完成崩掘,手動(dòng)分發(fā)
adhoc
分發(fā)選項(xiàng)
手動(dòng)簽名
選擇簽名
簽名信息確認(rèn)
導(dǎo)出到目錄

備份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ò)中可以查看墨状。

獲取IP

創(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目錄列赎,privatecerts文件夾分別生成了私鑰和證書。

/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版本查看

如果顯示了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)貌踏。

啟動(dòng)nginx

打開Mac的系統(tǒng)偏好設(shè)置->安全與隱私->防火墻->關(guān)閉十饥,即關(guān)閉Mac的防火墻。

接著在瀏覽器中打開我們之前設(shè)定的服務(wù)地址祖乳。

http://192.168.0.103

打開分發(fā)網(wǎng)頁

配置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)容如下:

檢查DAPP目錄

現(xiàn)在就可以通過腳本來構(gòu)建分發(fā)應(yīng)用了。

使用Shell直接構(gòu)建App并分發(fā)

把iOS_Distribution目錄下的AutoSh目錄拷貝到App1的工程根目錄铣墨,然后使用終端打開工程根目錄下的AutoSh,執(zhí)行:

sh distribute.sh -h

可以看到:

分發(fā)腳本選項(xiàng)列表

終端顯示了腳本的使用方法级解,這里我們執(zhí)行下列指令:

sh distribute.sh -b Release -s App1 -u "修復(fù)問題若干;優(yōu)化性能若干田绑;增加功能若干勤哗;XXX xx,XXX_XX"

執(zhí)行,如下圖所示掩驱,終端窗口自動(dòng)將更更新內(nèi)容顯示出來了芒划,并展示了更多的日志信息。

執(zhí)行分發(fā)腳本后的效果

直到構(gòu)建完成欧穴。

構(gòu)建完成腳本展示提示

此時(shí)我們打開分發(fā)的網(wǎng)頁地址民逼,發(fā)現(xiàn)歷史版本中多了一項(xiàng)記錄,即剛才構(gòu)建的項(xiàng)目涮帘。

構(gòu)建分發(fā)完成后分發(fā)網(wǎng)頁會(huì)多一條構(gòu)建記錄

嘗試更改App1工程內(nèi)的版本信息拼苍,再次執(zhí)行分發(fā)指令,并嘗試更改工程的Scheme為App1_DEV或App1:


更改XCode工程中的版本號(hào)
  • 分發(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)建類型弦叶。

多次構(gòu)建不同版本和渠道的應(yīng)用

我們點(diǎn)擊一條記錄棚点。

Mac端上的分發(fā)詳情頁

即跳轉(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情況方能使用)默责。

iOS移動(dòng)設(shè)備上的分發(fā)詳情頁

手機(jī)掃碼后Safari瀏覽器打開分發(fā)詳情頁,首次安裝App前需要點(diǎn)擊頁面左下角的安裝SSL證書(描述文件)咸包,并去手機(jī)設(shè)置->通用->關(guān)于本機(jī)中信任該描述文件桃序,然再點(diǎn)擊點(diǎn)擊安裝字樣按鈕。

點(diǎn)擊安裝

然后就自動(dòng)安裝到手機(jī)上了烂瘫。

安裝完成

使用Jenkins來管理應(yīng)用分發(fā)

Jenkins安裝教程:https://gitee.com/jenkins-zhhttps://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首頁
創(chuàng)建任務(wù)
配置構(gòu)建參數(shù)Scheme
配置構(gòu)建參數(shù)下載HOST
配置構(gòu)建參數(shù)更新內(nèi)容
源碼管理
選擇配置Shell
配置Shell內(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)擊保存柠衅。

點(diǎn)擊保存

參數(shù)化構(gòu)建皮仁。

參數(shù)化構(gòu)建

設(shè)定構(gòu)建的參數(shù)。

執(zhí)行參數(shù)化構(gòu)建

開始構(gòu)建后可以看到構(gòu)建進(jìn)度菲宴。

選擇構(gòu)建參數(shù)

可從構(gòu)建任務(wù)重選擇查看控制臺(tái)輸出的日志贷祈。

選擇控制臺(tái)展示

日志顯示任務(wù)完成。

控制臺(tái)展示

構(gòu)建成功喝峦,然后進(jìn)入分發(fā)網(wǎng)頁势誊,即看到分發(fā)記錄里又多了一條記錄。接著就可以使用逸動(dòng)設(shè)備掃碼安裝應(yīng)用了谣蠢。

分發(fā)網(wǎng)頁多了一條記錄
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末粟耻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子漩怎,更是在濱河造成了極大的恐慌勋颖,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勋锤,死亡現(xiàn)場(chǎng)離奇詭異饭玲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)叁执,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門茄厘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谈宛,你說我怎么就攤上這事次哈。” “怎么了吆录?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵窑滞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我恢筝,道長(zhǎng)哀卫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任撬槽,我火速辦了婚禮此改,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侄柔。我一直安慰自己共啃,他們只是感情好占调,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著移剪,像睡著了一般究珊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挂滓,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天苦银,我揣著相機(jī)與錄音,去河邊找鬼赶站。 笑死幔虏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贝椿。 我是一名探鬼主播想括,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼烙博!你這毒婦竟也來了瑟蜈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤渣窜,失蹤者是張志新(化名)和其女友劉穎铺根,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體乔宿,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡位迂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了详瑞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掂林。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖坝橡,靈堂內(nèi)的尸體忽然破棺而出泻帮,到底是詐尸還是另有隱情,我是刑警寧澤计寇,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布锣杂,位于F島的核電站,受9級(jí)特大地震影響番宁,放射性物質(zhì)發(fā)生泄漏蹲堂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一贝淤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧政供,春花似錦播聪、人聲如沸朽基。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽稼虎。三九已至,卻和暖如春招刨,著一層夾襖步出監(jiān)牢的瞬間霎俩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工沉眶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留打却,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓谎倔,卻偏偏與公主長(zhǎng)得像柳击,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子片习,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容