标签:_for string name require 写入 账户 应用 完成 点击
From: Hailong‘s Blog (格式比专栏的好!)
作为公司的iOS程序员,少不了在发布应用的时候各种等待。标准的手动发布流程是:编译->打包上传->填写应用更新数据->等待iTunesConnect编译->选择版本发布,整个过程大概需要30分钟左右。关键是这个过程就像windows装系统一样,虽然手工参与的不多,但是要一直守在电脑前等着。
程序员这么懒,一定会想办法让他自动化的。后来发现特别懒的Felix Krause · GitHub)写的Fastlane,Fastlane可以非常快速简单的搭建一个自动化发布服务,并且支持Android,iOS,MacOS。他可以实现一条命令从编译到选版发布全程不用干预。作为程序员的你只要一条命令,看集美剧,发布就完成了。截止刚刚Fastlane官网上宣称已经为程序员节省了4百万小时+
这是一篇中速入门,看完这篇文章,自己搭建个「iOS自动发布服务」肯定是没问题了。这篇文章很长,有很多细节,可以当文档查。
文章难度:★☆☆☆☆
Fastlane是一套工具集,包括:
fastlane命令是一个流程控制的命令行工具(CLI),通过内部集成action和第三方的action完成一系列控制流程。运行fastlane命令行工具,会读取当前目录或者./fastlane目录下的Fastfile配置文件。
在Fastfile中:
一个简单的发布流程:
lane :deploy do
# 执行 pod instasll
cocoapods
# 执行 carthage bootstrap
carthage
# 增加build版本号
increment_build_number
# 编译代码
gym
# 发布到Apple Store
deliver(force: true)
end
苹果的系统升级率非常高,所以现在绝大部分开发者电脑应该是满足依赖要求的。
确保Xcode Command Line Tools 安装了最新版
xcode-select --install
如果你单独安装过ruby(如果你能看得懂这句),去掉sudo。如果使用系统自带的ruby,需要sudo权限
[sudo] gem install fastlane
在项目根目录下,初始化Fastlane:
fastlane init
提问了你的Apple ID,Team的问题之后,fastlane会自动检测当前目录下项目的App Name和App Identifier。如果检测的不对,选择n自行输入。
接下来会问你这个app是否需要在iTC和ADC中创建(上一步中如果选择y会自动检测是否需要创建),fastlane会调用produce进行初始化,如果现在还不想创建,也可以之后再运行produce init进行这个流程。如果不执行produce的流程,deliver的流程也会被掠过,当然之后也可以deliver init运行完全一样的流程。
在执行deliver init的过程中,会同步iTC中的所有语言的元数据和截图,并按照目录结构组织好。目录结构应该类似下面:
fastlane
├── Appfile
├── Deliverfile
├── Fastfile
├── metadata
│ ├── copyright.txt
│ ├── en-US
│ │ ├── description.txt
│ │ ├── keywords.txt
│ │ ├── marketing_url.txt
│ │ ├── name.txt
│ │ ├── privacy_url.txt
│ │ ├── release_notes.txt
│ │ └── support_url.txt
│ ├── primary_category.txt
│ ├── primary_first_sub_category.txt
│ ├── primary_second_sub_category.txt
│ ├── secondary_category.txt
│ ├── secondary_first_sub_category.txt
│ ├── secondary_second_sub_category.txt
│ └── zh-Hans
│ ├── description.txt
│ ├── keywords.txt
│ ├── marketing_url.txt
│ ├── name.txt
│ ├── privacy_url.txt
│ ├── release_notes.txt
│ └── support_url.txt
└── screenshots
├── README.txt
├── en-US
│ ├── 一堆png图片
这里肯定会被创建的是Appfile和Fastfile。如果Deliverfile,screenshots和metadata目录没被创建,可以运行deliver init来创建。
PS:
Fastlane的插件是一个或者一组action的打包,单独发布在fastlane之外。Fastlane Plugin 指南
自从16年5月份推出插件系统以来,现在已经有很多第三方的插件可以使用。查看所有插件:
fastlane search_plugins
这里介绍两个下文会用到的插件:
fastlane-plugin-versioning => 用来修改build版本号和version版本号。
Fastlane内嵌的actionincrement_build_number使用的是苹果提供的agvtool,agvtool在更改Build的时候会改变所有target的版本号。这时如果你在一个工程里有多个产品的话,每次编译,所有的Build都要加1,最后就不知道高到哪里去了。
有了fastlane-plugin-versioning不仅可以指定target增加Build,而且可以按照「语义化版本」规范增加Version,当然也可以直接设定Version。
PS:最开始写iOS时不知道怎么定义Build。现在我一般都直接定义成纯数字,比如100起,每次编译的时候让他自动加一。
fastlane-plugin-firim => 直接把AdHoc或者InHouse打包的ipa上传到fir.im,供测试下载。
安装上面的插件
fastlane add_plugin [name] # 安装方法
fastlane add_plugin versioning
fastlane add_plugin firim
可以把二进制发布到三个地方:
有了Fastfile,就可以添加自己的发布流程了。打开Fastfile文件(这里我用Sublime 设定语法为Ruby),如果不出意外的话你生成的Fastfile和我应该差不多。这里我就不贴出来了。
最开始定义了
在platform中就是需要修改的重点。先忽略before_all,after_all,error这些方法,这里的lane就是一组任务,上传到Firim的任务如下
lane :to_firim do
# 如果你用 pod install
cocoapods
# 如果你没有申请adhoc证书,sigh会自动帮你申请,并且添加到Xcode里
sigh(adhoc: true)
# 以下两个action来自fastlane-plugin-versioning,
# 第一个递增 Build,第二个设定Version。
# 如果你有多个target,就必须指定target的值,否则它会直接找找到的第一个plist修改
# 在这里我建议每一个打的包的Build都要不一样,这样crash了拿到日志,可以对应到ipa上
increment_build_number_in_plist(target: [target_name])
increment_version_number_in_plist(
target: [target_name],
version_number: ‘7.1.3‘
)
# gym用来编译ipa
gym(
output_directory: ‘./firim‘,
export_options: {
method: "ad-hoc", # 这可以不指定
thinning: "<none>"
}
)
# 上传ipa到fir.im服务器,在fir.im获取firim_api_token
firim(firim_api_token: [firim_api_token])
end
如果你不确定证书目前是否可用,可以用Sigh自动生成获取证书。Sigh会自动根据Appfile里设置的app_identifier从ADC(苹果开发者中心)生成证书,并下载到项目根目录下(不是fastlane目录),下载后自动安装。你可以通过指定output_path指定证书下载位置。
PS:建议不要把这个文件夹同步到项目的git中(Fastlane提供了match专门管理所有证书)。可以在.gitignore中可以忽略这个文件夹。
Sigh常用的配置项:
Name Type Description Default adhoc bool 获取adhoc证书 fasle development bool 更新开发证书,不更新production证书 false force bool 强制更新证书,不管证书是否在ADC中存在 false
iOS里code打包证书有4种,adhoc,inhouse,appstore,development证书。
价格 AppStore证书 In-House证书 AdHoc证书 Development证书 企业帐户 $299 √ √ √ 公司账号 $99 √ √ √ 个人账户 $99 √ √ √
其中In-House的方式打包的ipa安装没有设备的限制。AdHoc打包的ipa必须提前把设备的UDID添加到证书中,并且有100台设备限制。
所以如果你不指定adhoc为true,Sigh会识别帐户类型,企业帐户默认生成In-House证书,公司账号和个人帐户默认生成AppStore证书。
Gym常用配置项:
Name Type Description Default scheme string 指定需要编译的scheme clean bool 是否在编译前clean false output_directory string 导出目录 ./ output_name string 导出ipa名字 [app_name].ipa export_options hash/string 这里指定Xcode API的外部配置文件地址,或者配置hash,见下文 export_method string 打包方式,可选项app-store ad-hoc package enterprise development developer-id 如果在fastlane中使用了sigh,这个值会从上下文获取 include_bitcode bool 是否开启bitcode Xcode API 默认值为true include_symbols bool 是否生成符号表 Xcode API 默认值为true
Xcode7之后,Xcode API允许我们指定一个plist文件作为额外的配置文件。gym默认会帮你创建这个文件,你可以直接指定配置。更多关于plist可配置项,执行xcodebuild -help查看Available keys for -exportOptionsPlist。
export_method, include_symbols,和include_bitcode 这些参数都是exportOptionsPlist的配置,对应method,uploadSymbols和uploadBitcode。
Gym可以指定配置文件Gymfile。 初始化:
gym init
http://Fir.im是一个ipa托管网站。你可以用AdHoc或者In-House的方式打包,上传到http://fir.im发送给测试人员测试。需要先注册Fir.im帐户,并生成Token。这种方式适合:
Firim常用配置项:
Name Type Description Default firim_api_token string 指定http://fir.im的token ipa string ipa地址 如果使用gym,可以通过上下文获取 icon string icon的path,注意这里有个非常坑的地方,http://fir.im只支持jpg格式的图片
还有项如app_name等等,是用来配置http://fir.im页面属性的。firim --help
Firim的配置文件是Firimfile。初始化:
firim init
Firim是我完全仿照fastlane组件的方式写的,所以也可以单独作为CLI使用。
如果有任何Firim的问题请到Firim的issues提问。
配置完以上项,就可以一条命令发布到http://fir.im了:
fastlane to_firim
先看下lane:
lane :deploy do
# 如果你用 pod install
cocoapods
# 不带adhoc参数,sigh会自动生成App Store证书(公司或个人帐户)
sigh
increment_build_number_in_plist(target: [target_name])
increment_version_number_in_plist(
target: [target_name],
version_number: ‘7.1.3‘
)
# 指定输出目录
gym(
output_directory: ‘./build‘,
)
# 上传所有信息到App Store
deliver(force: true)
end
Deliver可以完全管理与iTC的交互。其中包括:
还记得上面初始化的时候初始化的metadata,screenshots目录么?iTC中的所有的元数据信息都被保存在metadata中,所有的截图信息都被保存在screenshots中。
metadata:
screenshots:
如果要通过deliver修改元数据或截图,你必须提供所有iTC后台中有的语言。比如后台中有「简体中文」和「英文」,你也必须提供对应的zh-Hans和en-US文件,否则deliver会报缺少语言的错误。可以在iTC后台提交的版本中删除语言。
Deliver常用配置项:
Name Type Description Default ipa string ipa地址 如果使用gym,可以通过上下文获取 metadata_path string 指定metadata目录地址 如果在fastlane中./fastlane/metadata,如果作为独立的命令行应用./metadata screenshots_path string 指定screenshots目录地址 如果在fastlane中./fastlane/screenshots,如果作为独立的命令行应用./screenshots skip_binary_upload bool 跳过二进制文件上传,适用于只想改metadata false skip_screenshots bool 跳过截图上传,如果截图没有变化,开启这项节约时间 false skip_metadata bool 跳过元数据上传 false force bool deliver会在上传时汇总信息生成HTML也,等待你审核。跳过这项审核此项设为true false submit_for_review bool 上传完成是否自动提交审核 false automatic_release bool 审核通过是否自动释放 false price_tier int App价格级别。注意:这项提交当时就会生效,所以更改价格还是在后天手动操作 submission_information hash 这是在iTC上点击提交之后的问答表格,可选项app_review_information hash 提供审核时的信息,详情 app_icon string 指定icon图片地址,必须为png格式
submission_information =>
前缀add_id_info => 可就关键了,对应「广告标识符」,如果你在App中使用了IDFA。你必须在这给个理由,而不能直接选false。
下图等价下表,App中投放了广告。
submission_information({
export_compliance_available_on_french_store: "false",
export_compliance_contains_proprietary_cryptography: "false",
export_compliance_contains_third_party_cryptography: "false",
export_compliance_is_exempt: "false",
export_compliance_uses_encryption: "false",
export_compliance_app_type: nil,
export_compliance_encryption_updated: "false",
export_compliance_compliance_required: "false",
export_compliance_platform: "ios",
content_rights_contains_third_party_content: "false",
content_rights_has_rights: "false",
add_id_info_limits_tracking: "true",
add_id_info_serves_ads: "true",
add_id_info_tracks_action: "false",
add_id_info_tracks_install: "false",
add_id_info_uses_idfa: "true"
});
deliver的CLI工具:
配置后,还是一条命令:
fastlane deploy
标签:_for string name require 写入 账户 应用 完成 点击
原文地址:http://www.cnblogs.com/fakeCoder/p/7560456.html