之前一直使用 fir-cli 工具来对项目进行打包,看了《小团队的自动化发布-Fastlane 带来的全自动化发布》这篇文章,决定试一试 fastlane 自动打包并上传到 fir.im。fastlane 参考文档可以到其github上进行查看,这里仅记录在使用 fastlane 自动打包到 fir.im 时踩过的坑。
安装
确保 Xcode 命令行工具安装了最新版本
xcode-select --install
接下来是安装 fastlane ,官网给出了三种方法
第一种是通过 Homebrew 软件包管理器来进行安装,第二种就是我们最熟悉的方式,下载安装包来进行安装,第三种是通过 RubyGems 来进行,RubyGems 是一个方便的 Ruby 程序包管理器,可以将一个 Ruby 应用程序打包到一个 Gem 里,作为一个安装单元。 一个 Gem 就是一个封装起来的应用程序或代码库。这里选择了第三种方法。
sudo gem install fastlane
初始化
到项目的根目录下,初始化 Fastlane
fastlane init
运行结束大概就是这个样子
会让你输入你的 Apple ID 之类的,会问你这个app是否需要在 iTunes Connect 等中创建,这里我选择了 n ,此时初始化结束,在项目目录下的 fastlane 文件夹下生成了两个文件 Appfile 和 Fastfile,这里面的具体内容 《小团队的自动化发布-Fastlane 带来的全自动化发布》已经讲解的很清楚了,就直接略过了,直接上 Fastfile 中用到的代码,因打包使用的是企业证书,因此将 method 方法设置为 enterprise 。
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: "XXXXX")
increment_version_number_in_plist(
target: "XXXXX",
version_number: '1.9.0'
)
# gym用来编译ipa
gym(
output_directory: './firim',
export_options: {
method: "enterprise", # 指定打包方式
teamID: "XXXXX",
thinning: "<none>"
},
scheme: "XXXXX"
)
# 上传ipa到fir.im服务器,在fir.im获取firim_api_token
firim(firim_api_token: "XXXXXXXXXXXXXXXXXXXX")
end
要运行上端代码,需要先添加两个插件,不然会报错
fastlane add_plugin versioning
fastlane add_plugin firim
踩坑之旅
接下来就可以执行以来命令来完成打包到 fir.im
fastlane to_firim
第一次执行到 cocopods 出错 😓
错误信息:
cocoapods is not part of the bundle, Add it to your Gemfile
这里首先要介绍下 bundle ,在配置文件 Gemfile 里说明你的应用依赖哪些第三方包,它会自动帮助你下载安装,并会下载这些包的依赖包。
于是到项目目录文件下找到 Gemfile 文件,添加 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)
执行
bundle install
重新执行
fastlane to_firim
结果执行到 cocoapods 又出错了 😓😓
这次的错误信息是:
The 'Pods-XXXXXX' target has frameworks with conflicting names: ummobclick.framework
大意是说和友盟有冲突,最终在这里找到了解决方法,参照里面的方法,现将友盟相关SDK注释掉,执行 pod update, 然后去掉注释,重新执行 pod update,重新执行打包命令,结果又出问题了(╯‵□′)╯︵┻━┻,不多说上图
提示
'AFURLConnectionOperation.h' file not found
用 Xcode 打开项目一看,确实有报错
感觉奇怪,之前明明可以正常运行,难道是 pod update 更新之后引入的问题?
对比 pod update 之前 AFNetworking 中 UIKit 的代码,发现更新之后多了个 UIAlertView+AFNetworking ,AFURLConnectionOperation.h not found 错入的引入正是由于该文件。于是我参照了上面处理友盟冲突的方法,移除之后又重新添加,然后问题就解决了。
再一次运行打包命令,🐶,其实第一次设置 fastlane 中的 gym 时,并没有设置 teamID,结果报错
# gym用来编译ipa
gym(
output_directory: './firim',
export_options: {
method: "enterprise", # 这可以不指定
thinning: "<none>"
},
scheme: "XXXXXXX"
)
在 Fastlane 中添加 teamID 之后,再次运行打包命令,终于执行成功上传到了 fir.im。
其实在执行的过程中,因为选择了企业账号,刚开始的时候 gym 中 method 选择了 ad-hoc,出了差错,具体错误可以看下图,因此在打包的过程中一定要注意证书与 method 的选择。
Can't find any applicable signing identities for items: (
"<IDEDistributionItem: 0x7f9869b91370 'com.wenwen.group' '<DVTFilePath:0x7f9868bbe760:'/Users/jing/Library/Developer/Xcode/Archives/2017-06-07/GroupWenWen 2017-06-07 16.12.07.xcarchive/Products/Applications/GroupWenWen.app'>'>"
)
Errors={
"<DVTSigningCertificate: 0x7f9869a257c0; name='iPhone Distribution: Beijing Sogou Technology Development Co., Ltd.', hash='08556715143C5BD36F7B8F3AAF342495A701CA6C', serialNumber='6EAB97F1C9F31281', certificateKind='1.2.840.113635.100.6.1.4, issueDate='2016-05-10 06:43:09 +0000''>" = {
"<IDEDistributionItem: 0x7f9869b91370 'com.wenwen.group' '<DVTFilePath:0x7f9868bbe760:'/Users/jing/Library/Developer/Xcode/Archives/2017-06-07/GroupWenWen 2017-06-07 16.12.07.xcarchive/Products/Applications/GroupWenWen.app'>'>" = "Error Domain=IDECodesignResolverErrorDomain Code=10 \"No matching provisioning profiles found\" UserInfo={NSLocalizedRecoverySuggestion=No valid 'ad-hoc' profiles were found., NSLocalizedDescription=No matching provisioning profiles found, IDECodesignResolverError_ResolutionInputsKey=<IDECodesignResolutionInputs: 0x7f9869a38270; portalTeamID='TUX63H4XEY', usingTeamBasedSigning='NO', bundleIdentifier='com.wenwen.group', targetName='(null)', provisioningProfilePurpose='2', requiresProvisioningProfile='YES', provisioningProfilePlatform='iOS', certificateKind='1.2.840.113635.100.6.1.4', requiredEntitlements='{\n \"application-identifier\" = \"TUX63H4XEY.com.wenwen.group\";\n \"keychain-access-groups\" = (\n \"TUX63H4XEY.com.wenwen.group\"\n );\n}', requiredCodesignableDevices='(null)', requiredFeatures='(null)'>\n}";
};
}
...
参考文章
https://whlsxl.github.io/#to_firim
https://henter.me/post/ruby-rvm-gem-rake-bundle-rails.html
http://www.jianshu.com/p/a04a6e055669