fir
fir.im 是一个免费的应用内测平台,可上传测试包到 fir 上,然后测试人员就可以下载安装应用测试了。fir 提供了一个命令行工具
fir-cli,可编译 iOS/Android 应用,并上传应用到 fir 平台上。
安装 fir-cli
$ gem install fir-cli
获取 fir 账号的 token,执行 fir login
,当使用 fir login 登录了之后, 后续命令都不需要加上 -T 参数, 会默认使用当前用户的 token 进行相关操作。
$ fir login XXX_YOUR_API_TOKEN_XXX
fir build_ipa 编译打包 ipa 文件:
schema="testFir"
fir build_ipa ~/Developer/$schema -o ~/Developer/build -w -C Release -S "$schema"
参数说明:-w 是 --workspace 的简写,表示编译 *.xcworkspace, 没有带这个参数则编译 xcodeproj 文件。 -C Release, 以 Release 方式打包,若 Debug 则是打调试包。 -S: 编译用 CocoaPods 做依赖管理的 .ipa 包。
上传包命令:
fir publish -c "first version log" ${schema}*.ipa
-c 后带 log。该命令将上传上一步生成的 ipa 包。默认的包名是 schema-版本号-build-build 号,如 testFir-2.5.3-build-576.ipa。把这几行代码保存成一个 shell 脚本,然后运行这个脚本就可以自动编译打包并上传应用到 fir 上,一步到位!
Fastlane
Fastlane 是一个 ruby 脚本集合成的工具套件,旨在实现iOS应用发布流程的自动化。Fastlane 包括了向 App Store 提交新应用或更新已有应用所需要的常用任务。
- gym 编译打包生成 ipa 文件
- deliver 用于上传应用的二进制代码,应用截屏和元数据到 App Store
- sigh 可以生成并下载开发者的 App Store 配置文件
- snapshot 可以自动化iOS应用在每个设备上的本地化截屏过程
使用 gem 安装 fastlane
sudo gem install fastlane
确保 Xcode 命令行工具已安装:
xcode-select --install
进入工程目录,初始化 fastlane 配置,运行命令
fastlane init
如图
在“Your Apple ID" 这一步输入苹果开发者账号,fastlane 会自动获取工程文件名,目录等其他数据。这一步“Please confirm the above values”,确认信息,没问题则输入 y。然后,fastlane 会进行一系列的初始化操作,包括下载 App Store 上的元数据和截屏文件。等待初始化完成之后,工程目录下就多了一个 fastlane目录:
$ cd fastlane && ls
Appfile Fastfile metadata report.xml
Deliverfile README.md screenshots
metadata 和 screenshots 是目录,metadata 下会存放元数据文件,包括关键词,版本更新日志等信息。screenshots 下是 App Store 上的截屏图片。
Appfile 记录应用的 bundle ID、Apple ID、Team ID,这个文件不用修改。
Fastfile 是执行脚本,有几个默认的选项,可直接使用。
打包并上传应用到 Apple TestFlight,运行命令:
$ fastlane beta
打包并上传应用到 App Store,执行命令
$ fastlane appstore
默认的脚本会上传元数据、应用截屏图片到 App Store,但我们可能只想传包。我们还需要设置版本号和编译号,这个时候就得修改 Fastfile。
首先在 Fastfile 文件开头添加一个函数,prepare_version
设置版本号。
default_platform :ios
scheme = "xiaoxinyong"
def prepare_version(options)
increment_version_number(
version_number: options[:version]
)
increment_build_number(
build_number: options[:build]
)
end
编译生成 ipa 文件,并上传至 App Store 的部分代码修改如下:
desc "Deploy a new version to the App Store"
lane :appstore do |options|
# match(type: "appstore")
# snapshot
prepare_version(options)
full_version = options[:version] + '_' + options[:build]
gym(scheme: "#{scheme}",
workspace: "#{scheme}.xcworkspace",
silent: true,
clean: true,
output_directory: "./build",
output_name: "#{scheme}_#{full_version}.ipa" ,
configuration: "Release") # 编译打包 ipa 文件
deliver(force: true,
skip_screenshots:true,
skip_metadata: true) # 不上传截屏文件和元数据。
# frameit
end
gym 是编译打包工具,可设置的参数:
scheme "Example" # 工程名
clean true # 编译前执行 clean,可减少 ipa 文件大小
output_directory "./build" # 打包后的 ipa 文件存放的目录
output_name "MyApp" # ipa 文件名
configuration: "Release" # 打包方式,Release 或者 Debug
需要注意的是,用 gym 打包的 ipa 文件会比直接用 Xcode 导出 ipa 文件大,但实际上传到 App Store 上的文件大小和 Xcode 的差不多。所以如果发现 ipa 文件大了许多,不用在意。
修改完之后,打包并上传应用到 App Store 的命令如下:
$ fastlane appstore version:2.5.4 build:200
如果我们想让 build number 自动生成,而不是每次都手动输入,使用increment_build_number
即可,但我在执行的时候,总会报错,于是改用其他方式,shell 脚本如下:
#!/bin/sh
#
# usage:
# > sh build_appstore.sh 2.5.4
#
SCHEMA="your schema"
PROJECT_PATH="/Users/your username/Developer/$SCHEMA"
BUILD_PATH="$PROJECT_PATH/build"
echo $PROJECT_PATH
# echo $BUILD_PATH
function useExample {
echo "\nUse Example: sh build_appstore.sh 2.5.4\n"
exit 1
}
[ -z "$1" ] && echo '请输入版本号' && useExample
PRODUCT_SETTINGS_PATH="$PROJECT_PATH/$SCHEMA/Info.plist"
OLD_NUMBER=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PRODUCT_SETTINGS_PATH"`
# If the build number key doesn't exist in the plist, we'll add it by setting its initial value to 1.
if [ $? -ne 0 ]; then
STARTING_NUMBER=1
OLD_NUMBER=1
echo "No build number present. Starting from ${STARTING_NUMBER}."
`/usr/libexec/PlistBuddy -c "Add CFBundleVersion string $STARTING_NUMBER" "$PRODUCT_SETTINGS_PATH"`
# exit 0
fi
NEW_NUMBER=$((OLD_NUMBER+=1))
`/usr/libexec/PlistBuddy -c "Set CFBundleVersion $NEW_NUMBER" "$PRODUCT_SETTINGS_PATH"`
[ $? -ne 0 ] && echo "error for increment build number" && exit 1
buildNumber=$NEW_NUMBER # 2000
versionNumber=$1 # 2.5.4
laneName=appstore
echo "build: $buildNumber, version: $versionNumber, lane: $laneName"
fastlane $laneName version:$versionNumber build:$buildNumber
之后要上传新版本到 App Store,运行如下命令即可:
$ sh build_appstore.sh 2.5.4
有了这几个脚本,编译发包只需一条命令,是不是很简单!
参考链接:
使用fastlane实现iOS持续集成
Automating Version and Build Numbers Using agvtool
Automatically Incrementing Version and Build Numbers