一党饮、實(shí)現(xiàn)多環(huán)境配置
概述
在項(xiàng)目中,分了開發(fā)驳庭、測(cè)試刑顺、預(yù)生產(chǎn)、生產(chǎn)四個(gè)環(huán)境饲常,之前切換環(huán)境蹲堂,是在項(xiàng)目中的配置類中,用一個(gè)宏定義贝淤,進(jìn)行環(huán)境的切換柒竞,每次切換環(huán)境都要修改代碼,有時(shí)還會(huì)被開發(fā)人員提交到Git中播聪,造成代碼問題和沖突朽基。所以就有了對(duì)項(xiàng)目工程進(jìn)行多環(huán)境配置的需求。
實(shí)現(xiàn)
使用 Build Configuration 和 Xcode Scheme 來管理多環(huán)境离陶,進(jìn)而構(gòu)建出不同環(huán)境版本的 App稼虎。為什么?因?yàn)檫@兩個(gè)是目前管理成本最低的辦法枕磁。
1渡蜻、Build Configuration
當(dāng)我們?cè)?Xcode 上新建一個(gè)項(xiàng)目的時(shí)候,Xcode 會(huì)自動(dòng)生成兩個(gè) Configuration:Debug和Release计济。Debug 用于日常的本地開發(fā)茸苇,Release 用于構(gòu)建和分發(fā) App。
而在我們的項(xiàng)目沦寂,除了Release環(huán)境学密,還另外創(chuàng)建了三個(gè)環(huán)境,對(duì)應(yīng)不同的后臺(tái)服務(wù)器環(huán)境传藏,分別為Development腻暮、Test、PreRelease毯侦。
Build Configuration就是一組 Build Setting哭靖。 我們可以通過 Build Configuration 來分組和管理不同組合的 Build Setting 集合,然后傳遞給 Xcode 構(gòu)建系統(tǒng)進(jìn)行編譯侈离。
例如:Architecture就可以根據(jù)configuration的環(huán)境進(jìn)行不同的配置
設(shè)置好了Build Configuration试幽,需要在構(gòu)建項(xiàng)目的過程中來選擇不同的configuration,需要用到Xcode Scheme卦碾。
2铺坞、Xcode Scheme
我們可以在New scheme中來創(chuàng)建新的Scheme起宽,我們創(chuàng)建了四個(gè)不同的Scheme
然后在Edit Scheme中,為每個(gè)Scheme選擇不同的Configuration
為了構(gòu)建出不同環(huán)境版本的 App济榨,我們需要經(jīng)常為各個(gè) Build Configuration 下的 Build Setting 設(shè)置不一樣的值坯沪。 在這其中,使用好 xcconfig 配置文件就顯得非常重要擒滑。
3腐晾、xcconfig
xcconfig也叫作 Build configuration file(構(gòu)建配置文件),我們可以使用它來為 Project 或 Target 定義一組 Build Setting橘忱。由于它是一個(gè)純文本文件赴魁,我們可以使用 Xcode 以外的其他文本編輯器來修改,而且可以保存到 Git 進(jìn)行統(tǒng)一管理钝诚。 這樣遠(yuǎn)比我們?cè)?Xcode 的 Build Settings 界面上手工修改要方便很多,而且還不容易出錯(cuò)榄棵。
我們創(chuàng)建了不同環(huán)境的xcconfig文件
在xcconfig文件中凝颇,我們進(jìn)行如下設(shè)置:
#include "BaseTarget.xcconfig"
PRODUCT_BUNDLE_NAME = $(inherited) 開發(fā)
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) DEVELOPMENT
其中PRODUCT_BUNDLE_NAME需要在info.plist中進(jìn)行更改:
GCC_PREPROCESSOR_DEFINITIONS這個(gè)在build setting中進(jìn)行設(shè)置:
這里是為了在代碼中進(jìn)行后臺(tái)服務(wù)器等環(huán)境的配置:
#define NetworkMacro_h
#if DISTRIBUTION
//生產(chǎn)服務(wù)器
#endif
#if PRERELEASE
//預(yù)生產(chǎn)服務(wù)器
#endif
#if TEST
//測(cè)試服務(wù)器
#endif
#if DEVELOPMENT
//開發(fā)服務(wù)器
#endif
至此,我們就將項(xiàng)目中的多環(huán)境配置好了疹鳄,再打包時(shí)拧略,我們只需要選擇不同的Scheme,就可以生成不同環(huán)境的包了瘪弓,并且app 名字 logo等信息也可以根據(jù)不同環(huán)境來區(qū)別展示出來垫蛆。
二、fastlane打包
概述
配置好了項(xiàng)目中的多環(huán)境腺怯,下一步就是要進(jìn)行自動(dòng)打包處理袱饭,之前用過shell腳本來進(jìn)行打包,這次學(xué)習(xí)了fastlane工具呛占,來進(jìn)行自動(dòng)打包的處理虑乖。
1、fastlane安裝
建議使用rbenv來管理fastlane和cocoapods晾虑,但電腦中一直是ruby直接安裝的疹味,就按直接安裝的順序來說吧。
打開終端
- 確認(rèn)是否安裝了Xcode命令行工具
xcode-select --install
- 如果用的是mac自帶的ruby帜篇,需要 sudo權(quán)限
sudo gem install fastlane
- 如果報(bào)錯(cuò):ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/commander
sudo gem install -n /usr/local/bin fastlane
2糙捺、fastlane配置
進(jìn)入到項(xiàng)目跟目錄下,注意每個(gè)項(xiàng)目都需要單獨(dú)的初始化一遍fastlane
fastlane init
在包含xxx.xcodeproj的項(xiàng)目目錄下執(zhí)行笙隙,會(huì)生成一個(gè)fastlane目錄洪灯,目錄之下有兩個(gè)文件Fastfile 打包信息文件 和 Appfile app賬號(hào)信息
- Appfile - 用來配置app_identifier app_id team_id信息
app_identifier "xxxxxxxx" # App的bundle identifier
apple_id("xxxx@xx.com") # 你的Apple ID
itc_team_id "xxxxxxx" # App Store Connect Team ID
team_id("xxxx") # Developer Portal Team ID
- Fastfile - 配置自動(dòng)化腳本
稍后會(huì)詳細(xì)寫明自動(dòng)化腳本
3、fastlane蒲公英以及fir插件安裝
fastlane add_plugin versioning
- 安裝fir插件
sudo fastlane add_plugin firim
sudo gem install -n /usr/local/bin fir-cli
- 安裝蒲公英插件
sudo fastlane add_plugin pgyer
- 如果遇到報(bào)錯(cuò)
sudo fastlane -n /usr/local/bin add_plugin pgyer
這樣操作之后在fastlane文件夾下面逃沿,會(huì)生成一個(gè)Pluginfile文件婴渡,內(nèi)容如下:
# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!
gem 'fastlane-plugin-versioning'
gem 'fastlane-plugin-firim'
gem 'fastlane-plugin-pgyer'
4幻锁、fastlane腳本
至此fastlane打包準(zhǔn)備工作已經(jīng)完成,接下來就是fastlane的腳本边臼,直接如下所示:
# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
# https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
# https://docs.fastlane.tools/plugins/available-plugins
#
# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
default_platform(:iOS)
SCHEME = ""
SCHEME_NAME = "JCJD"
IPA_TIME = Time.now.strftime("%Y%m%d%H%M")
PLIST_INFO_VERSION = get_version_number(target: "#{SCHEME_NAME}")
OUTPUT_DIRECTORY = "./packages"
ENV_PREFIX= ""
OUTPUT_NAME = ""
FIRIM_API_TOKEN = ""
PGY_API_KEY = ""
PGY_USER_KEY = ""
platform :iOS do
#開發(fā)環(huán)境包
lane :Development do
SCHEME = ""
ENV_PREFIX=""
EXPORT_METHOD = "development"
package(configuration: "Development")
end
#測(cè)試環(huán)境包
lane :Test do
SCHEME = "JCJDDevelopment"
ENV_PREFIX="JCJD_Test"
EXPORT_METHOD = "development"
package(configuration: "Test")
end
#預(yù)生產(chǎn)環(huán)境包
lane :PreRelease do
SCHEME = "JCJDPreRelease"
ENV_PREFIX="JCJD_PreRelease"
EXPORT_METHOD = "development"
package(configuration: "PreRelease")
end
#生產(chǎn)環(huán)境包
lane :Release do
SCHEME = "JCJDRelease"
ENV_PREFIX="JCJD_Release"
EXPORT_METHOD = "store"
package(configuration: "Release")
end
lane :package do |option|
#導(dǎo)出名稱
OUTPUT_NAME = "#{ENV_PREFIX}_#{PLIST_INFO_VERSION}_#{IPA_TIME}.ipa"
puts "#{OUTPUT_NAME}"
gym(
export_method: "#{EXPORT_METHOD}", #這里填寫導(dǎo)出方式 包括app-store, ad-hoc, package, enterprise, development
configuration: option[:configuration],
scheme: "#{SCHEME}",
output_directory: "#{OUTPUT_DIRECTORY}",
output_name: "#{OUTPUT_NAME}",
export_xcargs: "-allowProvisioningUpdates",
clean: true
)
case option[:configuration]
when 'PreRelease'
#打包成功后直接上傳到蒲公英
pgyer(api_key: "#{PGY_API_KEY}", user_key: "#{PGY_USER_KEY}", update_description: "更新預(yù)生產(chǎn)包")
else
#打包成功后直接上傳到fir.im
firim(firim_api_token: "#{FIRIM_API_TOKEN}")
end
end
end
在終端中哄尔,執(zhí)行fastlane腳本:
fastlane PreRelease
就可以打包成功啦!DⅰA虢印!
三臼予、Jenkins集成
概述
在可以成功使用fastlane進(jìn)行自動(dòng)化打包之后鸣戴,接下來進(jìn)行第三步,通過Jenkins來進(jìn)行配置粘拾,做到通過選擇環(huán)境參數(shù)窄锅,進(jìn)行打包。這里Jenkins的安裝以及其他插件的下載等一系列操作就不做說明了缰雇,可以自行百度入偷。主要是來看怎么通過Jenkins進(jìn)行參數(shù)的選擇配置,從而指揮fastlane實(shí)現(xiàn)自動(dòng)化打包械哟。
步驟
-
下載安裝Git Parameter Plug-In插件
image.png 創(chuàng)建一個(gè)新項(xiàng)目后疏之,勾選This project is parameterized
-
Add Parameters中選擇添加Git Parameter,并按如下圖設(shè)置:
image.png -
Add Parameter中暇咆,再選擇Choice Parameter锋爪,配置如下:
image.png -
在Git中,添加Add Branch爸业,如下圖:
image.png -
最后執(zhí)行fastlane腳本
image.png
構(gòu)建
選擇Build with Parameters其骄,進(jìn)行構(gòu)建:
大功告成~!
參考資料:
- https://kaiwu.lagou.com/course/courseInfo.htm?sid=&courseId=657&lagoufrom=noapp&sharetype=copy#/detail/pc?id=6656
- https://kaiwu.lagou.com/course/courseInfo.htm?sid=&courseId=657&lagoufrom=noapp&sharetype=copy#/detail/pc?id=6658
- http://www.reibang.com/p/20e8321e44aa/
- http://www.reibang.com/p/6407d253a9e4