之前一直使用 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.lxweimin.com/p/a04a6e055669