最近遇到一个需求,就是同一份iOS源码用不同的账号打包不同平台(App Store或企业打包)的多个app,并且每个app的名称、图标、启动图和app内的一些基础信息不同,并且要对这些app持续维护更新。最终采用多 target + fastlane 的方式实现,此篇文章记录下流程和注意点。
配置多Target
我们在一个工程里创建多个target来管理不同的app的配置信息,首先在 TARGETS 里右键选择要作为模板的target,点击Duplicate复制target。
这个操作会复制一个target、scheme和info.plist 配置文件,得到下图:
然后我们可以修改target、scheme和info.plist名称。
注意修改info.plist文件名后需要重新为 target 指定info.plist配置文件。
然后我们就可以单独修改这个target的Bundle Identifier、app图标等信息了,比如我们修改app的图标,先添加AppIcon。
如果在app内需要根据不同的target配置一些差异性的内容或图片,我们可以在对应的info.plist中添加字段来控制。比如我们可以在info.plist中添加我们想要的数据:
然后创建一个配置文件来保存这些配置到内存中供我们使用,我用的是Swift语言,所以我使用全局变量,如果是OC可以使用单利对象的形式。
这样我们就可以在app内对字符串、图片或者一些逻辑判断进行区别控制了。最后需要注意的是,如果使用的是CocoaPods来管理我们的第三方库,我们需要在Profile里重新指定下target。
至此我们对项目的多target配置已经完成,我们已经可以使用Xcode来打包这些target了。接下来,我们使用fastlane来自动构建我们的项目。
配置Fastlane
安装fastlane的过程请自行谷歌或查阅官方文档 https://github.com/fastlane/fastlane ,这里就不赘述了,下面的步骤是确保你已经成功安装了Fastlane的情况下继续的。
在项目目录,初始化fastlane。
$ fastlane init
执行过程中,第一个?号直接回车,后面会提示输入苹果开发者账号等信息,设置后会自动去下载app元数据信息。如果我们是使用多个账号打包,这里可以随便输入一个即可,这次需求不需要自动提交App Store,所以无需在意。
fastlane初始化成功后,会在项目目录下生成一个fastlane目录,里面会有以下几个文件和目录。
Appfile文件
:用于配置app_identifier、apple_id、team_id。
Deliverfile文件
:用于配置跟 app 版本发布到App Store相关的信息,我们这里暂时不使用。
Fastfile文件
:用于编写逻辑脚本,使用 ruby 语言,比如打包、上传到App Store或蒲公英的脚本。
metadata目录
:存放 app 元数据,包括 app 简介、Icon、Copyright 等信息。
screenshots目录
:存放App Store下载的应用截图。
接下来我们可以针对每个target单独创建一个环境配置文件,在fastlane目录下创建 .env.xxxx
文件,内容参考如下:
APPLE_ID = "开发者账号" FASTLANE_PASSWORD = "开发者密码" TEAM_ID = "团队ID" APP_IDENTIFIER = "Bundle Identifier" SCHEME_NAME = "scheme名称" METHOD = "打包方式,可选enterprise、app-store等"
然后在Appfile文件中引用这些配置:
app_identifier ENV['APP_IDENTIFIER'] apple_id ENV['APPLE_ID'] team_id ENV['TEAM_ID']
最后在Fastfile文件中编写打包逻辑:
fastlane_version "2.66.2" default_platform :ios platform :ios do desc "打包单个" lane :deploy do gym( scheme: ENV['SCHEME_NAME'], export_method: ENV['METHOD'], output_directory: "导出ipa文件的目录路径" ) end desc "打包所有" lane :deploy_all do cocoapods sh "fastlane deploy --env daihuanbao" sh "fastlane deploy --env kahuan" sh "fastlane deploy --env qingsonghuan" sh "fastlane deploy --env shishihuan" sh "fastlane deploy --env suixinghuan" sh "fastlane deploy --env ti500wanshenhe" sh "fastlane deploy --env wuyoudaihuan" sh "fastlane deploy --env yihuan" sh "fastlane deploy --env eyongka" end end
就算是不会Ruby语法,从上面的代码中也能清晰的看出,我们只是反复的去调用gym打包不同的target。也就是有多少个target就配置多少个 .env 配置文件,有多少个 .env 配置文件就在 deploy_all 中执行多少次 deploy 指令。
至此我们可以使用一下命令,打包所有target到指定的ipa目录了,如果不需要上传到蒲公英或者希望自己手动上传的话可以这样做。
fastlane deploy_all
配置蒲公英
蒲公英官网的文档中有详细的说明 https://www.pgyer.com/doc/view/fastlane ,这里我简介的介绍一下流程。首先我们要先安装蒲公英提供的fastlane插件:
fastlane add_plugin pgyer
安装成功后,会在项目根目录下生成 Gemfile 和 Gemfile.lock 文件,在fastlane目录下生成 Pluginfile 文件。我们需要修改 Gemfile 文件,在 gem 'fastlane'
后面添加 gem 'cocoapods'
,修改后的内容如下:
# Autogenerated by fastlane # # Ensure this file is checked in to source control! source "https://rubygems.org" gem 'fastlane' gem 'cocoapods' plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') eval_gemfile(plugins_path) if File.exist?(plugins_path)
然后还需要在 Fastfile 文件中配置蒲公英的 app_key
和 user_key
,在 https://www.pgyer.com/account/api 可以查看自己蒲公英的key。修改后 Fastfile 的内容如下:
fastlane_version "2.66.2" default_platform :ios platform :ios do desc "打包单个" lane :deploy do gym( scheme: ENV['SCHEME_NAME'], export_method: ENV['METHOD'], output_directory: "导出ipa文件的目录路径" ) pgyer(api_key: "你的app_key", user_key: "你的user_key") end desc "打包所有" lane :deploy_all do cocoapods sh "fastlane deploy --env daihuanbao" sh "fastlane deploy --env kahuan" sh "fastlane deploy --env qingsonghuan" sh "fastlane deploy --env shishihuan" sh "fastlane deploy --env suixinghuan" sh "fastlane deploy --env ti500wanshenhe" sh "fastlane deploy --env wuyoudaihuan" sh "fastlane deploy --env yihuan" sh "fastlane deploy --env eyongka" end end
最后我们可以回到项目所在目录,执行以下命令进行自动打包自动上传到蒲公英:
bundle exec fastlane deploy_all