iOS 打包(一)--精簡總結(jié)(證書、自動(dòng)化、持續(xù)集成等)(精簡)

目錄

  • 一、描述文件.mobileprovision的再次認(rèn)識
  • 二、使用Xcode增加環(huán)境變量為每個(gè)打包環(huán)境對應(yīng)一個(gè)打包模式
  • 三、認(rèn)識打包命令
  • 四、自動(dòng)化打包時(shí)候,參數(shù)化環(huán)境改變
  • 五、打包完后
    1、Bugly 符號表上傳
    2、分支branch與標(biāo)簽tag
  • 附:描述文件的位置與內(nèi)容查看

其他文章:
iOS 打包(二)--掃碼安裝問題的完整排查

前言

首先說明這邊不對簡單的打包再累訴,因?yàn)榫W(wǎng)上一堆。
這邊只對一些平時(shí)不容易注意的東西,以及重要的一些點(diǎn)進(jìn)行說明。

1、要達(dá)到的目的/效果:

構(gòu)建一個(gè)Jenkins項(xiàng)目,通過該項(xiàng)目,在輸入打包環(huán)境后自動(dòng)打包項(xiàng)目。

2、實(shí)現(xiàn)過程中需要了解和操作的東西:
  • ①項(xiàng)目中存在多個(gè)環(huán)境
  • ②每個(gè)環(huán)境都有自己打包時(shí)候需要的對應(yīng)描述文件

一、描述文件.mobileprovision的再次認(rèn)識

通過以下表格,你將認(rèn)識到為什么你這個(gè)環(huán)境需要使用這個(gè)描述文件打包,用其他描述文件會(huì)有什么問題。

類型 可安裝的設(shè)備 證書環(huán)境(開發(fā)/生產(chǎn)) 推送 用于測試環(huán)境(測試/預(yù)生產(chǎn)/生產(chǎn))
development 已注冊的設(shè)備 開發(fā)環(huán)境的證書 測試環(huán)境的推送 測試環(huán)境
adhoc 已注冊的設(shè)備 生產(chǎn)環(huán)境的證書 和appstore一樣的正式環(huán)境推送 預(yù)生產(chǎn)環(huán)境
appstore 所有的設(shè)備 生產(chǎn)環(huán)境的證書 appstore的推送肯定是要正式環(huán)境的 生產(chǎn)環(huán)境

所以在需要考慮收到的推送環(huán)境是否正確的情況下,有下面的因果關(guān)系:

①測試環(huán)境:需要"測試推送",且可以測試,所以只能使用development;
②預(yù)生產(chǎn)環(huán)境:需要"正式推送",且可以測試,即又不能上線,所以只能用adhoc;
③生產(chǎn)環(huán)境:需要"正式推送"環(huán)境,又需要上線,所以只能用appstore;

二、使用Xcode增加環(huán)境變量為每個(gè)打包環(huán)境對應(yīng)一個(gè)打包模式

首先,請回想你是否有以下這個(gè)笨笨的經(jīng)歷,如果有請認(rèn)真看本節(jié)內(nèi)容。

什么經(jīng)歷呢?即:給測試人員打預(yù)發(fā)布版本的時(shí)候,去Xcode設(shè)置里選xxx_adhoc.mobileprovision,提線上版本的時(shí)候,又去Xcode里將它改為xxx_appstore.mobileprovision。

image.png

本操作沒什么問題,就是你不覺得如果可以不用改來改去的話會(huì)更好嗎?
所以,以下說法鑒于你不想每次打包時(shí)候去Xcode設(shè)置里頻繁的根據(jù)所需要的環(huán)境修改使用的描述文件。不去修改才是正道,如果你習(xí)慣了頻繁的修改,建議你改掉那個(gè)習(xí)慣。如果你不想改,請略過本小節(jié)。

  • 問題/為什么會(huì)有此操作:
    我們的正常開發(fā)環(huán)境總有“測試環(huán)境”、“預(yù)生產(chǎn)環(huán)境”、“生產(chǎn)環(huán)境”三種環(huán)境,而Xcode默認(rèn)的模式只有DEBUG和RELEASE兩種模式。沒法讓我們一一對應(yīng)。
  • 解決:
    在項(xiàng)目中增加一個(gè)預(yù)發(fā)布環(huán)境或者再增加其他多個(gè)環(huán)境。即使用Xcode增加環(huán)境變量為每個(gè)打包環(huán)境對應(yīng)一個(gè)打包模式
  • 步驟:

步驟①、點(diǎn)擊下方的"+",選擇復(fù)制Debug模式的欄目

image.png

細(xì)心的你,可能會(huì)發(fā)現(xiàn)我們項(xiàng)目中這里有pod,所以我們需要立即執(zhí)行一下pod install,讓pod自己去生成新的正確的xcconfig文件才能被識別到。否則待會(huì)你編譯的時(shí)候會(huì)報(bào)錯(cuò)。那么你打包的時(shí)候肯定也會(huì)報(bào)錯(cuò),一般是報(bào)Pod庫問題,如下圖
image.png

重新pod install后的圖如下:
image.png

步驟②、因?yàn)閯?chuàng)建的 Prerelease 環(huán)境變量,是copy Debug模式下的,所以在Xcode的配置中需要更改預(yù)編譯的環(huán)境變量為PRERELEASE=1,,修改處路徑是:TARGETS-->Build Settings-->Preprocessor Macros
image.png

恭喜您,至此,使用Xcode增加環(huán)境變量為每個(gè)打包環(huán)境對應(yīng)一個(gè)打包模式結(jié)束。


分割圖1.jpg

附:有時(shí)候您還想讓app根據(jù)不同的環(huán)境顯示不同的應(yīng)用名,那么您可以:

image.png

打包配置就講到這,下面講講打包命令。這個(gè)在自動(dòng)化打包中常需要用到。建議都熟悉一下。

三、認(rèn)識打包命令

所使用的打包命令:

# 進(jìn)入build路徑clean一下你的工程
xcodebuild clean -workspace ${TARGET_NAME}.xcworkspace -scheme ${TARGET_NAME} -configuration ${BUILD_TYPE}

# archive導(dǎo)出.xcarchive文件
xcodebuild archive -workspace ${TARGET_NAME}.xcworkspace -scheme ${TARGET_NAME} -archivePath {ARCHIVEPATH}

# 導(dǎo)出ipa包
xcodebuild -exportArchive -archivePath "${ARCHIVEPATH}/${TARGET_NAME}.xcarchive" -exportPath ${EXPORTPATH} -exportOptionsPlist ${EXPORTOPTIONSPLIST}

解釋:
${TARGET_NAME} 項(xiàng)目對應(yīng)targets的名字
${BUILD_TYPE} 打包類型 Debug,Release 等
${archivePath} .xcarchive文件導(dǎo)出目錄
${EXPORTPATH} 導(dǎo)出.ipa包的目錄
${EXPORTOPTIONSPLIST} exportOptionsPlist文件所在目錄,可判斷development, ad-hoc等
1、archive

2、exportArchive

這個(gè)步驟,著重介紹需要使用的exportOptionsPlist文件內(nèi)容是怎樣的,如果要修改要怎么修改

所以,我們再對平時(shí)手動(dòng)打包出來的文件目錄,重新認(rèn)識下。細(xì)心的你應(yīng)該發(fā)現(xiàn)里面其實(shí)已經(jīng)有一個(gè)ExportOptions .plist文件了。

ExportOptions(打包出來的文件目錄).png

我們打開該文件查看一下里面的內(nèi)容。

ExportOptions(打包出來的內(nèi)容).png

下面我們舉個(gè)例子

# 一個(gè)完整 exportOptionsPlist 文件內(nèi)容如下:

<?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>
    <false/>
    <key>method</key>
    <string>development</string>
    <key>provisioningProfiles</key>
    <dict>
        <key>com.dvlproad.Demo</key>
        <string>com.dvlproad.Demo_development</string>
    </dict>
    <key>signingCertificate</key>
    <string>iPhone Developer</string>
    <key>signingStyle</key>
    <string>manual</string>
    <key>stripSwiftSymbols</key>
    <true/>
    <key>teamID</key>
    <string>你的teamID,不管是什么描述文件,teamID都是一樣的</string>
    <key>thinning</key>
    <string>&lt;none&gt;</string>
</dict>
</plist>

其中的重點(diǎn)是

<dict>
    <key>com.dvlproad.Demo</key>
    <string>com.dvlproad.Demo_development</string>
</dict>

上面的key值,是bundleID,肯定是有"."的;
但是下面的string值,是蘋果開發(fā)者中心下管理描述文件下的Name,而不是下載下來生成的Name,或者自己改的Name。
這個(gè)點(diǎn)尤其要注意。

描述文件匹配.png

仔細(xì)看圖,上面的Name自己在創(chuàng)建時(shí)候,命名的是有.的,所以我們這邊exportOptionsPlist文件中的這個(gè)string值,也應(yīng)該使用有.的(當(dāng)然如果你取的時(shí)候是沒有,那這邊也應(yīng)該是沒有,反正這邊的是要和網(wǎng)站上的Name保持一致的,而不是自己隨便重命名的那個(gè))。

四、自動(dòng)化打包時(shí)候,參數(shù)化環(huán)境改變

參數(shù)化環(huán)境改變,這是什么鬼意思?

首先,在我們的項(xiàng)目中,肯定有一個(gè)變量是控制當(dāng)前打包的是什么環(huán)境的代碼吧。一般的代碼如下:

#import "STDemoEnvironmentConfig.h"

//@"Product",
//@"PreProduct",
//@"Develop1",
//@"Develop2",
//@"Develop3",
NSString * const STDemoCurrentEnvironment = @"PreProduct";  //取值為上述五個(gè)中的一個(gè)

如果我們是手動(dòng)打包,那么每次打包之前都得修改當(dāng)前打包的環(huán)境變量。那自動(dòng)化打包的時(shí)候呢?難不成我們也那么處理,每次打包時(shí)候,去修改項(xiàng)目中的代碼,讓其打包成我們想要的環(huán)境。可以,但不要這么做,下面將告訴你為什么?

試想以下兩種情況,情況①,什么功能都沒修改,只是為了換個(gè)打包環(huán)境就得去修改代碼,然后重新commit,Jenkins再構(gòu)建,是不是感覺不知不覺多了很多不必要的commit節(jié)點(diǎn)。情況②,某個(gè)分支下已經(jīng)是穩(wěn)定的了,如master,但是測試人員想要不同的環(huán)境,你認(rèn)為為了這個(gè)需求,你頻繁的去改這個(gè)穩(wěn)定的版本有必要嗎?(情況①在這里就顯得更容易理解了)。

所以為了避免這些多余的無用功,我們將更改環(huán)境的操作,參數(shù)化到Jenkins中執(zhí)行命令的地方,通過命令中所帶的參數(shù)結(jié)合python腳本,讓python腳本去把我們項(xiàng)目中的環(huán)境變量值改為命令中的。

這里我們把環(huán)境改變腳本macro_env.py和要改變的文件單獨(dú)提取出來測試。

參數(shù)化環(huán)境改變1.png

可以看到執(zhí)行命令后,腳本中指定的文件中的CJDemoCurrentEnvironment變量的值被我們改變成了Develop3(原本在項(xiàng)目中的值為Develop1)。

附:腳本小樣地址:CJDemo
分割圖1.jpg

五、打包完后

1、Bugly 符號表上傳

打包完后,為了能快速并準(zhǔn)確地定位用戶APP發(fā)生Crash的代碼位置,每次Jenkins構(gòu)建成功后,需要上傳符號表到Bugly,以備后續(xù)使用符號表對APP發(fā)生Crash的程序堆棧進(jìn)行解析和還原。詳細(xì)操作略,請前往官網(wǎng)查看Bugly iOS 符號表配置的配置方法。

2、分支branch與標(biāo)簽tag

①、功能開發(fā)時(shí)候的分支情況:

功能開發(fā)時(shí)候的分支情況.png

②、進(jìn)入發(fā)布時(shí)候的分支情況:

進(jìn)入發(fā)布時(shí)候的分支情況.png

③、發(fā)布后開始維護(hù)時(shí)候的分支情況:

發(fā)布后開始維護(hù)時(shí)候的分支情況.png

附:描述文件的位置與內(nèi)容查看

描述文件的位置~/Library/MobileDevice/Provisioning Profiles

描述文件的位置.png

在上圖中,點(diǎn)擊 空格鍵可以查看描述文件的詳細(xì)信息,如下圖:

描述文件的詳細(xì)信息.png

End

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 用到的組件 1、通過CocoaPods安裝 2、第三方類庫安裝 3、第三方服務(wù) 友盟社會(huì)化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 15,207評論 1 180
  • 那是我還很小的時(shí)候,我已經(jīng)記不起來那是上小學(xué)幾年級了。那一天,鄰居從鎮(zhèn)上租來了碟片,那一年,我家還沒有VCD。...
    七色泥閱讀 850評論 2 10
  • 今天六點(diǎn)半起床,上午送女兒去上培訓(xùn)班,然后為大公益聯(lián)誼會(huì)做準(zhǔn)備,十一點(diǎn)準(zhǔn)時(shí)出發(fā)前往鄂州,中午和同學(xué)們一起午餐,三點(diǎn)...
    星鑠閱讀 273評論 0 0
  • 文/辛超凡 老高不老,是一位30多歲的姐姐;我與老高不熟,我們僅有一面之緣;我該叫她高姐,“老高”是高姐的自稱;所...
    拾月星河閱讀 1,117評論 15 20
  • 1、如何讓程序員更高效的工作? 讓程序員只做他們該做的,幫他們做好其他的所有事!說的通俗一點(diǎn),一個(gè)需求下達(dá)到程序員...
    斷指鶴閱讀 467評論 5 2

友情鏈接更多精彩內(nèi)容