在我们的日常开发中,打包可以说是一个即没什么技术含量,又浪费时间的工作,xcode自带的archive很好用,但是需要你守在电脑前,每完成一步然后点击确定进入下一步。显然这种重复费时的工作就要交给脚本去做了。

关于fastlane

fastlane是Facebook开源的一个针对iOS,macOS和安卓应用的打包工具,fastlane中有lane和action两个概念,lane就好像是富士康流水线,action就好比是流水线上的装配工,比如我现在要上传一个beta测试包到TestFlight上供测试人员进行测试,那么就有一条publish_to_testflight的流水线,流水线上有签名build上传这三个装配工人。这三个工人各司其职,流水化作业,最后产出就是一个上传到了TestFlight上的软件安装包。

干就完了!

我们的目标是开发完成之后,运行脚本,脚本会自动打包,签名,上传阿里云OSS,上传完成之后钉钉群机器人发消息通知测试人员。这一套下来要行云流水,没有半点拖泥带水!

安装fastlane
  1. 首先需要我们安装xcode命令行工具(我想一般大家都是安装了的吧)
  2. sudo gem install fastlane -NV或者brew install fastlane安装fastlane
  3. cd到工程文件的根目录下运行fastlane init
  4. 专有钉钉ios上传formdata不起作用 钉钉ios怎么上传文件_objective-c

  5. 选择2自动分发上传TestFlight
  6. 专有钉钉ios上传formdata不起作用 钉钉ios怎么上传文件_objective-c_02

  7. 选择对应的scheme,如果有多个scheme的话,可以随便选一个,后面可配置
  8. 之后会让你登录你的开发者账号
  9. 专有钉钉ios上传formdata不起作用 钉钉ios怎么上传文件_ios_03

  10. 选择对应的team(如果有多个的话)
  11. 专有钉钉ios上传formdata不起作用 钉钉ios怎么上传文件_objective-c_04

  12. 完成之后会在当前工程文件目录下生成一个fastlane文件夹,里面存放着appfilefastlane两个文件
安装插件

为了达到我们的需求,我们这里需要使用到两个插件

  • 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一定要是英文!!!

专有钉钉ios上传formdata不起作用 钉钉ios怎么上传文件_上传_05

大功告成!