iOS使用fastlane一键打包、提交应用

当开发的应用越来越多,或者应用提交的频率越来越高,就会体会到打包、提交这些重复的工作是多么枯燥且无聊还耗时;那么自然就会考虑让机器帮我们完成这一系列的工作,fastlane无疑是这样一个理想好用的工具;

fastlane初始化

  • 安装正确的Ruby版本,需要2.0及以上版本
ruby -v
  • 安装fastlane
sudo gem install fastlane

或者

brew install fastlane
  • 初始化配置
    cd到项目路径下,执行命令
fastlane init
  1. 首先会提示让你选择fastlane用途,因为需要提交App Store这里选择3
  2. 输入Apple ID和密码及验证码
  3. 选择是否下载metadata(如果App Store上对应的Apple ID已经有相应的App,则会自动下载所有的app数据)
init
metadata

metadata数据包括App的预览/截屏图片,图片比较多比较大时可能只能下载到部分图片;
这时可以执行以下命令单独下载图片:

fastlane deliver download_screenshots

如果在下载图片这步报错,需要添加--use_live_version

  • fastlane结构
    初始化成功后,项目下会多出一个fastlane的文件,所有数据、配置均在这个目录下;
fastlane

如果fastlane目录下的文件缺少Deliverfilemetadata,可能是在fastlane init的第一步选错了选项;可以执行以下命令重新生成:

fastlane deliver init

fastlane配置

  • Appfile
    这个文件主要配置、app和apple id相关信息;包括app_identifier,apple id,team id;这个一般会根据你初始化填的Apple ID自动生成;
  • Deliverfile
    这个文件就是配置App提交审核的相关信息;有两种方式:
    1. 使用metadata
      所有数据都会直接metadata文件下自动读取,这种方式Deliverfile配置比较简单:
 # The Deliverfile allows you to store various App Store Connect metadata
# For more information, check out the docs
# https://docs.fastlane.tools/actions/deliver/

metadata_path "./fastlane/metadata" # 根据你自己的metadata路径配置
force true              # Skip verification of HTML preview file
submit_for_review false     # 提交审核
automatic_release false     # 自动发布
#auto_release_date          # 自动发布时间
skip_screenshots false      # 是否不更新预览图
overwrite_screenshots true  # 是否清空之前的预览图再添加
skip_binary_upload false        # 是否不上传ipa
  1. 编写脚本
    不使用metadata,相关信息直接编写对应的命令;这些命令和apple developer网站添加提交信息都是一一对应的,可以把它看成通过接口的形式添加应用信息;
    具体的命令可以参考官网,说明的比较详细了;
    贴一个比较详细的配置:
# The Deliverfile allows you to store various App Store Connect metadata
# For more information, check out the docs
# https://docs.fastlane.tools/actions/deliver/

#metadata_path "./fastlane/metadata"
#skip_metadata true     # 是否使用metadata
#screenshots_path "./fastlane/screenshots"

force true              # Skip verification of HTML preview file
submit_for_review false     # 提交审核
automatic_release false     # 自动发布
#auto_release_date          # 自动发布时间
skip_screenshots false      # 是否不更新预览图
overwrite_screenshots true  # 是否清空之前的预览图再添加
skip_binary_upload false        # 是否不上传ipa

primary_category 'BUSINESS' # 分类

copyright("@#{Time.now.year} xx版权所有 翻版必究") # 版权信息

keywords({              # 关键字
  "en-US" => "english is poor",
  "zh-Hans" => "关键词1,关键词2"
})

support_url({           # 技术支持网站
  "en-US" => "https://xxx.com",
  "zh-Hans" => "https://xxxx.com"
})

submission_information({        # 使用广告的情况
    add_id_info_uses_idfa: true,
    add_id_info_serves_ads: false,
    add_id_info_tracks_install: false,
    add_id_info_tracks_action: false,
    add_id_info_limits_tracking: false
})

app_review_information(     # 审核信息
  first_name: "xx",
  last_name: "xx",
  phone_number: "+8618xxxxxxxx",
  email_address: "[email protected]",
  demo_user: "xxxxxxx",
  demo_password: "1234567",
  notes: ""
)

app_review_attachment_file "./fastlane/fastSign.MP4"   # 附件信息



app_version '5.7.8' 
#build_number '5.7.8'

name({                  # app名称
  "en-US" => "english is poor",
  "zh-Hans" => "应用名称"
})

privacy_url({           # 隐私政策url
  "en-US" => "https://xx.xx.com/xxx",
  "zh-Hans" => "https://xx.xx.com/xxx"
})

release_notes({         # 版本新增内容
  "en-US" => "english is poor",
  "zh-Hans" => "1) 升级测试第一行\n2) 升级测试第二行"
})

description({           # 描述
  "en-US" => "english is poor",
  "zh-Hans" => "应用描述。。。。
"
})

需要注意的是,一些信息比如privacy_url,release_notes是区分地区的,配置时需要编写两套:en-USzh-Hans否则执行会报错;

  • Fastfile
    这个文件就是配置我们需要执行的脚本;
    在对 Fastfile 进行配置前,我们先了解下几个概念;
    1. lane
      lane可以理解为 fastlane 的执行脚本,一个Fastfile 里可以编写任意个lane,每个lane都可以独立运行,也可以嵌套运行。
    2. fastlane actions
      actions相当于就是对一些脚本的封装,为了方便我们使用,fastlane定义了很多actions供我们使用,可以像函数调用一样实现不同的功能;同时我们也可以自定义actions;
      官方定义好的actions:https://docs.fastlane.tools/actions/,常用的actions有:gym,deliver,cocoapods

应用打包到提交App Store审核的Fastfile大致如下:

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane

default_platform(:iOS)

platform :iOS do
  desc "sumbmit"        # lane描述
  lane :upload_app do
    # 打包
    gym(
        scheme: "your scheme",
        workspace: "your.xcworkspace",
        include_bitcode: false
     )

     # 发布
     deliver
  end
end

运行

所有都配置好后,cd到项目路径执行需要的lane

fastlane upload_app

之后命令行就会输出相应的日志;
deliver阶段,如果Deliverfile配置缺少,命名行都会有错误日志:

根据对应的提示补充即可;
需要注意的是,上传元数据时,App Store要求使用专用密码;否则将会报错

专用密码可以在apple accout页面设置

Multi-Target打包、发布

以上对单个应用的配置相对比较简单,但当需要提交多个应用,比如一个project中有多个target时,该怎么办呢;无需为每个target配置一份脚本,fastlane提供了Environment Variables,也就是环境变量;可以通过配置不同的环境变量实现Multi-Target打包、发布;
具体步骤:

  • 新建Environment文件
    fastlane的Environment文件为.env文件,fastlane初始化后,默认不会有.env配置文件,需要手动添加文件;
    cd到fastlane文件目录下,为每个target创建.env文件
    touch .env.targetA
    touch .env.targetB
    

.开头的文件为隐藏文件,添加后显示隐藏文件即可看到添加的.env文件;

  • 配置不同的环境变量
    根据自己的业务需求,归纳出变量并为每个target的.env文件配置;

.env.targetA

APP_IDENTIFIER = "com.xxx.targeta"

SCHEME = "targetA"

SCREENSHOTS_PATH = "./fastlane/targeta/screenshots"

APP_REVIEW_ATTACHMENT_FILE = "./fastlane/targeta/fastSign.MP4"

APP_VERSION = "5.0.0"

APP_NAME = "第一个APP"

DESCRIPTION = "第一个APP的描述"

.env.targetB也是一样的配置、只是value更换为自己需要的;

  • 使用环境变量
    环境变量在Appfile、Deliverfile、Deliverfile等文件中均可使用;使用语法:
ENV['变量KEY']

Appfile

app_identifier(ENV['APP_IDENTIFIER']) 

Deliverfile

app_version ENV['APP_VERSION']  
#build_number ENV['APP_VERSION']

name({                  # app名称
  "en-US" => "english is poor",
  "zh-Hans" => ENV['APP_NAME']
})

description({               # 描述
  "en-US" => "english is poor",
  "zh-Hans" => ENV['DESCRIPTION']
})

  • 执行
    执行时需要指定对应的环境变量
fastlane upload_app --env targetA
  • lane嵌套
    之前介绍lane时说过每个lane都可以独立运行,也可以嵌套运行,对于需要一键打包提交多个target的,我们就可以编写嵌套的lane:

Fastfile

default_platform(:iOS)
 
platform :iOS do

desc "sumbmit_all"
lane :upload_all do
   sh "fastlane upload_app --env targetA"
   sh "fastlane upload_app --env targetB"
 end

desc "sumbmit"
lane :upload_app do
  gym(
      scheme: ENV[' SCHEME'],
      workspace: "app.xcworkspace",
      include_bitcode: false
   )

  deliver
end

end

  • 批量打包、提交
fastlane upload_all

如果一切正常的话,应用就已经自动提交审核了;本来繁琐的事情最后转换为fastlane upload_all一句命令搞定,省时省力还能愉快的摸鱼


AppleID登录有效期为1个月,超过一个月后连接App Store时会提示输入6 digit码;如果输入后不能正常登录;
需要执行命令:

bundle exec fastlane spaceauth

重新验证、获取session;

你可能感兴趣的:(iOS使用fastlane一键打包、提交应用)