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: "xx@xx.com",
  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;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容