Fastlane支持蘋果雙重認(rèn)證終極解決方案

如查看解決流程搓茬、可直接翻到總結(jié)

前言(可忽略)

項(xiàng)目在測試階段辣往,已經(jīng)配置完成遠(yuǎn)程Jenkins+Fastlane自動化打包AdHoc包,并且完善了各個實(shí)用功能:

  1. convert命令更改App圖標(biāo),添加版本號、build號帖蔓、打包時間等相關(guān)內(nèi)容,方便QA人員區(qū)分包版本
  2. Jenkins多參數(shù)化構(gòu)建瞳脓,構(gòu)建時可設(shè)置版本號、build號澈侠、選擇git分支劫侧、選擇釘釘通知人員等功能,并處理好各個參數(shù)的默認(rèn)值
  3. 接入Jenkins DingTalk插件哨啃,實(shí)現(xiàn)構(gòu)建失敗等意外情況發(fā)生時烧栋,可釘釘通知開發(fā)人員查看日志并解決
  4. Shell腳本實(shí)現(xiàn)打包完成后,自動上傳ipa包至Fir或蒲公英平臺
  5. Shell腳本實(shí)現(xiàn)包上傳至三方平臺后拳球,釘釘通知QA人員下載安裝新包進(jìn)行測試
  6. 接入Fastlane send_email插件审姓,實(shí)現(xiàn)打包完成后,郵件通知開發(fā)人員(個人空閑郵箱)
    后續(xù)會將以上實(shí)現(xiàn)的功能進(jìn)行總結(jié)
  • AdHoc包的自動化已經(jīng)趨近完善祝峻,但是正式包還是一直由我手動去打包并手動上傳至AppStore的魔吐。
  • 之前我一直不建議正式包使用自動化的方式去構(gòu)建,原因是我認(rèn)為正式包不會去經(jīng)常構(gòu)建莱找,且出于包大谐昴贰(比如fastlane ShenZhen會影響ipa包大小)奥溺、包安全性(之前有小伙伴用不同Xcode打出來的包運(yùn)行起來會導(dǎo)致閃退)考慮還是手動更放心一些辞色。但是因?yàn)榘姹镜目焖俚視霈F(xiàn)各個版本穿插發(fā)布的情況浮定,自動化被迫(被現(xiàn)實(shí)打斚嗦)提上了日程。
  • 考察了下桦卒,發(fā)現(xiàn)市面上其實(shí)有很多都有介紹正式包自動化的文章立美,說明我之前擔(dān)心的問題其實(shí)是多余的,所以就放手去做了這個事

一闸盔、前期準(zhǔn)備

還是采用Jenkins+Fastlane的方案悯辙,前期為了將AdHoc包和正式包區(qū)分開來,所以在Jenkins上,對此分別構(gòu)建了兩個Item躲撰,一個專門構(gòu)建AdHoc包针贬,一個專門構(gòu)建正式包。后期其實(shí)可以合并為一個Item拢蛋,用Jenkins的多參數(shù)構(gòu)建加以區(qū)分

Jenkins Items

二桦他、配置Jenkins

  • 在AdHoc任務(wù)項(xiàng)的基礎(chǔ)上,去除convert更改圖標(biāo)谆棱、釘釘通知快压、郵箱通知、上傳三方平臺等QA輔助功能
  • 更新fastlane文件垃瞧,更改對應(yīng)的正式包證書與配置文件
  • fastlane添加deliver這個action蔫劣,上傳至AppStore(下面會詳細(xì)點(diǎn)總結(jié)下deliver)

三、Fastlane action之deliver

對于Fastlane最常用的兩個action个从,就是gym和deliver脉幢,gym是Shenzhen的進(jìn)階,作為App構(gòu)建使用的工具嗦锐。deliver是將二進(jìn)制上傳至App Store Connect的工具嫌松。其分別有自己對應(yīng)的配置項(xiàng),在fastlane官方文檔可查奕污,也可以使用fastlane action deliver命令進(jìn)行查看萎羔。
下面是我從網(wǎng)上看到前人文章后二次總結(jié)的deliver部分常用的配置項(xiàng)及說明。

配置項(xiàng) 說明 備注
ipa ipa壓縮包文件所在路徑
pkg pkg壓縮包文件所在路徑 mac應(yīng)用使用
username 上傳的蘋果郵箱賬號 默認(rèn)值為打包機(jī)鑰匙串存儲的賬號
app_identifier 應(yīng)用程序的BundleId
team_id 如果你在多個團(tuán)隊(duì)碳默,你的iTunes Connect團(tuán)隊(duì)的ID
team_name 如果你在多個團(tuán)隊(duì)中贾陷,你的iTunes Connect團(tuán)隊(duì)的名字
platform 使用的平臺 默認(rèn)值為ios
metadata_path 包含元數(shù)據(jù)文件夾的路徑,元數(shù)據(jù)中保存的appStore中你應(yīng)用的具體內(nèi)容介紹(如標(biāo)題腻窒、描述)
screenshots_path 包含屏幕快照文件夾的路徑 不建議使用昵宇,若使用則需遵循AppStoreConnect要求的規(guī)則
skip_screenshots 不上傳屏幕快照 默認(rèn)值為false,建議設(shè)置為true
skip_metadata 不上傳元數(shù)據(jù) 默認(rèn)值為false儿子,建議設(shè)置為true
app_version 應(yīng)該編輯或創(chuàng)建的App版本 默認(rèn)是Xcode中設(shè)置的版本號
build_number build號 默認(rèn)是Xcode中設(shè)置的build號
force 跳過HTML報告文件驗(yàn)證 默認(rèn)值為false瓦哎,建議設(shè)置為true
submit_for_review 在上傳所有內(nèi)容后提交新版本進(jìn)行審核 默認(rèn)值為false
automatic_release 審核通過后,是否自動發(fā)布 默認(rèn)值false
auto_release_date 審核通過后自動發(fā)布App Store的以毫秒為單位的日期 默認(rèn)值為false
price_tier 元數(shù)據(jù)相關(guān):價格層級 元數(shù)據(jù)相關(guān)的不建議在此使用
subtitle柔逼、name 蒋譬、description 、app_icon 等 元數(shù)據(jù)相關(guān):應(yīng)用程序副標(biāo)題愉适、名字犯助、描述、圖標(biāo)等 元數(shù)據(jù)的配置不建議自動化
generate_ipa(typePrefix,options,exportMethod,codeSigningIdentify,matchType)
      deliver(
        ipa: "./build/#{APP_NAME}.ipa",
        skip_screenshots: true,
        skip_metadata: true,
        force: true,
        submit_for_review: false
        ...
      )
  end

四维咸、Deliverfile

以上介紹了fastlane的其中一個action deliver的相關(guān)配置剂买,可以發(fā)現(xiàn)其實(shí)deliver的很多配置可以多個應(yīng)用是通用的惠爽,比如說使用的開發(fā)者郵箱、是否手動發(fā)布等配置項(xiàng)瞬哼。這時就可以建立一個與Fastfile同目錄的名為Deliverfile的文件婚肆,其顧名思義,就是deliver的配置文件坐慰,deliver的通用配置都可以在此文件中去設(shè)置较性。

app_identifier "com.xxx.xxxxx" # The bundle identifier of your app
username "xxx@xxx.cn" # your Apple ID user
automatic_release false
force true
...

注意:Deliverfile的優(yōu)先級要高于fastfile中deliver的配置

這樣另外一個App下Fastlane中deliver的一些通用配置就不用設(shè)置了,直接復(fù)制粘貼過來Deliverfile即可

五结胀、賬號登錄(雙重認(rèn)證)

做完以上這一切赞咙,覺得應(yīng)該萬事大吉了。打包機(jī)鑰匙串里也存有對應(yīng)的蘋果賬號的密碼糟港,所以瀟灑地按下立即構(gòu)建攀操。一段時間過后發(fā)現(xiàn)構(gòu)建成功了,但是并沒有收到蘋果的郵件啊~打開Jenkins的構(gòu)建日志如下:

Error: Unable to validate your application. Sign in with the app-specific password you generated. 
If you forgot the app-specific password or need to create a new one, go to appleid.apple.com

打包雖然成功了秸抚,但是因?yàn)樘O果開發(fā)者賬號開啟了雙重認(rèn)證崔赌,所以僅有賬號和密碼還是不能夠成功登錄賬號的。于是屁顛地跑去fastlane官網(wǎng)尋找解決方案耸别,發(fā)現(xiàn)了這個:
fastlane官網(wǎng)針對雙重認(rèn)證情況下給出的deliver解決方案

可以看到官方給出四種方案,前兩種方案都是Manual verification(內(nèi)心MMP),后兩種有一個被標(biāo)記了deprecated县钥,那就只有第三個方案了??秀姐。正好解決了我的選擇困難癥。下面就介紹一下這個方案的流程:

  • 生成一個不需要進(jìn)行短信認(rèn)證的application specific password若贮,這個需要到 蘋果開發(fā)者中心的賬號管理下進(jìn)行生成省有。注意生成后將其備份,因?yàn)轫撁嬉坏╆P(guān)閉將無法再次查看
  • 執(zhí)行命令 fastlane spaceauth -u [開發(fā)者賬號]谴麦,生成FASTLANE_SESSION,將其備份
  • 配置環(huán)境變量如下:
export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=[application specific password(替換為你自己的)]
export FASTLANE_SESSION=[FASTLANE_SESSION(替換為你自己的)]
  • 執(zhí)行source ~/.bash_profile使新增的環(huán)境變量生效蠢沿,分別執(zhí)行以下命令查看環(huán)境變量是否設(shè)置成功
echo $FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD
echo $FASTLANE_SESSION

注意:

  1. 生成的FASTLANE_SESSION,真正的實(shí)體要從第一個value處開始到第一個value結(jié)束匾效,不要全部一股腦全部配置到環(huán)境變量文件中舷蟀,否則會因?yàn)楦袷絾栴}導(dǎo)致變量設(shè)置失敗
  2. 如官網(wǎng)提示,使用application specific password的情況下面哼,deliver不要做上傳二進(jìn)制之外的其他操作野宜,比如設(shè)置元數(shù)據(jù)等,否則可能會導(dǎo)致方案失效
    fastlane官網(wǎng)截圖Note

六魔策、上傳二進(jìn)制文件至App Store Connect(雙重認(rèn)證)

做完以上操作后匈子,Jenkins重新構(gòu)建,一段時間后仍顯示成功闯袒,卻沒收到蘋果郵件虎敦。繼續(xù)查看Jenkins構(gòu)建日志如下:

Login to App Store Connect (xxx@xxx.cn)
Login successful
...
Uploading binary to App Store Connect
Going to upload updated app to App Store Connect
[32mThis might take a few minutes. Please don't interrupt the script.?[0m
[31mTransporter transfer failed.?[0m
[31mSign in with the app-specific password you generated. If you forgot the app-specific password or need to create a new one, go to appleid.apple.com (-22938)
?[0m
[31mYour account has 2 step verification enabled?[0m
[31mPlease go to [https://appleid.apple.com/account/manage?[0m](https://appleid.apple.com/account/manage%1B[0m)
[31mand generate an application specific password for?[0m
[31mthe iTunes Transporter, which is used to upload builds?[0m
[31mTo set the application specific password on a CI machine using?[0m
[31man environment variable, you can set the?[0m
[31mFASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD variable?[0m

可以看到這次賬號登錄成功了游岳,但是上傳二進(jìn)制到App Store Connect時再次被雙重認(rèn)證攔截,并且fastlane還給出了建議的解決方案其徙,仔細(xì)一看胚迫,MMP!@揲佟晌区!這不就是我解決登錄時的解決方案嗎?不禁感嘆用謊言去驗(yàn)證謊言通贞,得到的一定是謊言朗若。
所幸繼續(xù)往下看,發(fā)現(xiàn)這么兩句

[32mPlease provide your Apple Developer Program account credentials?[0m
[32mThe login information you enter will be stored in your macOS Keychain

這兩句給了我靈感昌罩,可以把keychain下開發(fā)者賬號對應(yīng)的密碼改為application specific password哭懈,我們可以使用CredentialsManager重設(shè)鑰匙串對應(yīng)的開發(fā)者賬號密碼。步驟如下:

fastlane官網(wǎng)截圖之CredentialsManager重置鑰匙串密碼

可以看到官網(wǎng)上也是說這種方案會對持續(xù)集成的情況下有效

注意:application specific passwordFASTLANE_SESSION的有效期為一個月左右茎用,所以切記要及時對環(huán)境變量和鑰匙串對應(yīng)的密碼進(jìn)行更新

后話

最后再次進(jìn)行重新構(gòu)建遣总,如愿看到以下日志信息:

[32mSuccessfully exported and compressed dSYM file?[0m
[32mSuccessfully exported and signed the ipa file:?[0m
...
Login to App Store Connect (xxx@xxx.cn)
Login successful
...
[32mSuccessfully set the version to '3.0.0'?[0m
Uploading binary to App Store Connect
Fetching password for transporter from environment variable named `FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD`
Going to upload updated app to App Store Connect
[32mThis might take a few minutes. Please don't interrupt the script.?[0m
[32miTunes Transporter successfully finished its job?[0m
[32m--------------------------------------------------------------------?[0m
[32mSuccessfully uploaded package to App Store Connect. It might take a few minutes until it's visible online.?[0m
[32m--------------------------------------------------------------------?[0m
[32mFinished the upload to App Store Connect?[0m

大功告成,登錄開發(fā)者后臺可以再次確認(rèn)一下是否上傳成功~

總結(jié)

  • 基本的Jenkins+fastlane配置
  • 配置fastlane的deliver轨功、Deliverfile
  • 配置bash_profile環(huán)境變量旭斥,增加FASTLANE_SESSIONFASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD變量古涧,使得CI情況下正常登錄雙重認(rèn)證賬號
  • 使用CredentialsManager重設(shè)鑰匙串對應(yīng)的開發(fā)者賬號密碼為application specific password,使得CI情況下可以正常上傳二進(jìn)制包到雙重認(rèn)證賬號的后臺中
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末垂券,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子羡滑,更是在濱河造成了極大的恐慌菇爪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柒昏,死亡現(xiàn)場離奇詭異凳宙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)职祷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門氏涩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人堪旧,你說我怎么就攤上這事削葱。” “怎么了淳梦?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵析砸,是天一觀的道長。 經(jīng)常有香客問我爆袍,道長首繁,這世上最難降的妖魔是什么作郭? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮弦疮,結(jié)果婚禮上夹攒,老公的妹妹穿的比我還像新娘。我一直安慰自己胁塞,他們只是感情好咏尝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啸罢,像睡著了一般编检。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扰才,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天允懂,我揣著相機(jī)與錄音,去河邊找鬼衩匣。 笑死蕾总,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的琅捏。 我是一名探鬼主播生百,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柄延!你這毒婦竟也來了置侍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拦焚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后杠输,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赎败,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年蠢甲,在試婚紗的時候發(fā)現(xiàn)自己被綠了僵刮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹦牛,死狀恐怖搞糕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曼追,我是刑警寧澤窍仰,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站礼殊,受9級特大地震影響驹吮,放射性物質(zhì)發(fā)生泄漏针史。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一碟狞、第九天 我趴在偏房一處隱蔽的房頂上張望啄枕。 院中可真熱鬧,春花似錦族沃、人聲如沸频祝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽常空。三九已至,卻和暖如春未辆,著一層夾襖步出監(jiān)牢的瞬間窟绷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工咐柜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兼蜈,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓拙友,卻偏偏與公主長得像为狸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子遗契,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

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