在我们的日常开发中,打包可以说是一个即没什么技术含量,又浪费时间的工作,xcode自带的archive很好用,但是需要你守在电脑前,每完成一步然后点击确定进入下一步。显然这种重复费时的工作就要交给脚本去做了。
关于fastlane
fastlane是Facebook开源的一个针对iOS,macOS和安卓应用的打包工具,fastlane中有lane和action两个概念,lane就好像是富士康流水线,action就好比是流水线上的装配工,比如我现在要上传一个beta测试包到TestFlight上供测试人员进行测试,那么就有一条publish_to_testflight
的流水线,流水线上有签名
、build
、上传
这三个装配工人。这三个工人各司其职,流水化作业,最后产出就是一个上传到了TestFlight上的软件安装包。
干就完了!
我们的目标是开发完成之后,运行脚本,脚本会自动打包,签名,上传阿里云OSS,上传完成之后钉钉群机器人发消息通知测试人员。这一套下来要行云流水,没有半点拖泥带水!
安装fastlane
- 首先需要我们安装xcode命令行工具(我想一般大家都是安装了的吧)
sudo gem install fastlane -NV
或者brew install fastlane
安装fastlane- cd到工程文件的根目录下运行
fastlane init
- 选择2自动分发上传TestFlight
- 选择对应的scheme,如果有多个scheme的话,可以随便选一个,后面可配置
- 之后会让你登录你的开发者账号
- 选择对应的team(如果有多个的话)
- 完成之后会在当前工程文件目录下生成一个fastlane文件夹,里面存放着
appfile
、fastlane
两个文件
安装插件
为了达到我们的需求,我们这里需要使用到两个插件
- alioss ———— 上传阿里云OSS
- ding_talk_msg_push ———— 钉钉机器人发送消息
在当前工程文件根目录下,有一个gemfile
文件。我们需要在此文件中添加两行
source "https://rubygems.org"
gem "fastlane"
gem 'fastlane-plugin-alioss'
gem 'aliyun-sdk', '~> 0.3.0'
gem 'fastlane-plugin-ding_talk_msg_push'
然后运行bundle install
命令来安装插件
编写脚本
插件安装完成之后就可以开始编写我们的打包脚本了
# 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)
platform :ios do
desc "Push a new beta build to TestFlight"
lane :beta do
increment_build_number(xcodeproj: "your_app.xcodeproj")
build_app(workspace: "your_app.xcworkspace", scheme: "teacher_appstore")
upload_to_testflight
end
desc "Upload a new ad-hoc build to Alioss"
lane :test do
build_app(workspace: "your_app.xcworkspace",
scheme: "your_app",
silent: true,
clean: true,
export_xcargs: "-allowProvisioningUpdates",
export_method: "ad-hoc",
output_name: "your_app",#一定要是英文!!!
export_options: ({
method: "ad-hoc",
compileBitcode: true,
signingStyle: "automatic",
stripSwiftSymbols: true
}))
alioss(endpoint: "oss-cn-beijing.aliyuncs.com", access_key_id: "your_ak", access_key_secret: "your_sk", bucket_name: "your_bucketname", update_description: "update by fastlane")
ding_talk_msg_push(token: "your_ding_talk_token", text: "测试包更新,下载地址:https://bucketname.oss-cn-beijing.aliyuncs.com/app/index.html", at_all: true)
end
end
脚本中的build_app()
就是一个fastlane自带的action,我们只需要填入参数即可,具体的参数列表可以查看fastlane的官方文档
alioss()中填入阿里云oss的endpoin的sk和ak
钉钉中设置机器人的安全设置中(三种必须选一种)我选择的是关键词触发,只要是我们的消息中包含关键词,消息就能被发送出去
注意事项
- 你的ruby需要升级到2.4以上
- 在上传alioss的时候可能会出现报错
'fetch': key not found: :ciphers
的报错,解决办法
解决办法:cd /Users/mac/.rvm/gems/ruby-2.7.0/gems/rest-client-1.8.0/lib/restclient
修改此文件夹底下的request.rb
文件
将这段代码
if WeakDefaultCiphers.include?(
OpenSSL::SSL::SSLContext::DEFAULT_PARAMS.fetch(:ciphers))
@ssl_opts[:ciphers] = DefaultCiphers
end
修改为
if defined?(OpenSSL::OPENSSL_LIBRARY_VERSION) && OpenSSL::OPENSSL_LIBRARY_VERSION.start_with?("OpenSSL 1.1")
ciphers = OpenSSL::SSL::SSLContext.new.ciphers.map(&:first).join(':')
else
ciphers = OpenSSL::SSL::SSLContext::DEFAULT_PARAMS.fetch(:ciphers)
end
- export_options中的output_name一定要是英文!!!
大功告成!