Fastlane 匹配构建 adhoc 和应用商店

Jan*_*Jan 3 xcode ios fastlane fastlane-match fastlane-gym

我正在使用 Fastlane matchgym来构建我的应用程序并将其从 CI (Bitrise) 分发到 Fabric。我的 Xcode 设置设置为手动,并使用 AdHoc 配置文件进行发布配置,如Fastlane 文档中所述

\n\n

现在我想从 CI 分发到 Appstore,但它失败了,因为 XcodeRelease配置设置为使用 AdHoc 配置文件,并且 Match 安装了 AppStore 配置文件。

\n\n
+---------------------------------------------------------------+-----------------------------------------------------------------------------+\n|                                                           Summary for gym 2.112.0                                                           |\n+---------------------------------------------------------------+-----------------------------------------------------------------------------+\n| scheme                                                        | AeroNavMap                                                                  |\n| export_method                                                 | app-store                                                                   |\n| export_xcargs                                                 | -allowProvisioningUpdates                                                   |\n| export_options.provisioningProfiles.net.tequilaapps.airnavmap | match AppStore net.tequilaapps.airnavmap                                    |\n| workspace                                                     | ./PEMap.xcworkspace                                                         |\n| destination                                                   | generic/platform=iOS                                                        |\n| output_name                                                   | AeroNavMap                                                                  |\n| build_path                                                    | /Users/vagrant/Library/Developer/Xcode/Archives/2019-01-06                  |\n| clean                                                         | false                                                                       |\n| output_directory                                              | .                                                                           |\n| silent                                                        | false                                                                       |\n| skip_package_ipa                                              | false                                                                       |\n| result_bundle                                                 | false                                                                       |\n| buildlog_path                                                 | /var/folders/90/5stft2v13fb_m_gv3c8x9nwc0000gn/T/fastlane_logs957341986/gym |\n| skip_profile_detection                                        | false                                                                       |\n| xcode_path                                                    | /Applications/Xcode.app                                                     |\n+---------------------------------------------------------------+-----------------------------------------------------------------------------+\n[13:47:38]: $ set -o pipefail && xcodebuild -workspace ./PEMap.xcworkspace -scheme AeroNavMap -destination \'generic/platform=iOS\' -archivePath /Users/vagrant/Library/Developer/Xcode/Archives/2019-01-06/AeroNavMap\\ 2019-01-06\\ 13.47.38.xcarchive archive | tee /var/folders/90/5stft2v13fb_m_gv3c8x9nwc0000gn/T/fastlane_logs957341986/gym/AeroNavMap-AeroNavMap.log | xcpretty\n[13:47:42]: \xe2\x96\xb8 \xe2\x9d\x8c  error: No profile for team \'XXXXXXXX\' matching \'match AdHoc net.tequilaapps.airnavmap\' found: Xcode couldn\'t find any provisioning profiles matching \'G9MA9G2SST/match AdHoc net.tequilaapps.airnavmap\'. Install the profile (by dragging and dropping it onto Xcode\'s dock item) or select a different one in the General tab of the target editor. (in target \'AeroNavMap\')\n[13:47:42]: \xe2\x96\xb8 ** ARCHIVE FAILED *\n
Run Code Online (Sandbox Code Playgroud)\n\n

这一切都是有道理的,但问题是我应该如何设置 Xcode,以便我可以拥有两个 Fastlane 通道,一个用于构建 AppStore,另一个用于 AdHoc。

\n\n

可以创建一个新的 Xcode 配置AppStore,在其中设置 AppStore 配置文件,但这会引发另一个问题,即我的自定义框架无法构建。类似于这个问题。我有许多自定义框架,我也需要AppStore在他们的 Xcode 项目中创建相同的配置,但这太过于黑客解决方案。

\n\n

我尝试强制gym使用 AppStore 配置文件,如下所示,但这没有帮助。Xcode 中设置的 AdHoc 配置文件仍在使用。

\n\n
  desc "Builds the app for the AppStore"\n  lane :build_appstore do\n      match(type: "appstore", readonly: true)\n      build_app(\n          scheme: "AeroNavMap",\n          export_method: "app-store", \n          skip_profile_detection: true,\n          export_options: { provisioningProfiles: { "net.tequilaapps.airnavmap" => "match AppStore net.tequilaapps.airnavmap"}}\n          )\n  end\n
Run Code Online (Sandbox Code Playgroud)\n\n

我当前的解决方案是在构建之前手动更新 xcodeproj,但这也不是很干净

\n\n
  lane :build_appstore do\n      match(type: "appstore", readonly: true)\n      if Helper.ci? \n        UI.message "Patching Xcode proj to use AppStore profile"\n        `sed -i.bak -e \'s/match AdHoc net.tequilaapps.airnavmap/match AppStore net.tequilaapps.airnavmap/g\' ../PEMap/PEMap.xcodeproj/project.pbxproj`\n      end\n      build_app(scheme: "AeroNavMap", export_method: "app-store")\n  end\n
Run Code Online (Sandbox Code Playgroud)\n

rea*_*guy 6

当您归档构建时(使用 Xcode 或gym),有两个代码签名阶段:构建时使用的代码签名身份(在 Xcode 中,这是在目标的构建设置中设置的内容)和导出存档时使用的代码签名身份(通过 Xcode 手动导出存档时,您在管理器的导出对话框中选择的那个)

\n\n

调用gym 时,我们在 Fastfiles 中所做的操作是将两者设置为相同的值。我们使用 xcargs 覆盖构建设置,并使用与我们在 export_options 中设置的签名相同的签名:

\n\n
MY_APP_ID = "com.foo.bar"\nMY_PROFILE = "match AppStore com.foo.bar"\nMY_TEAM = \xe2\x80\xa6\n\nmatch(\n    app_identifier: MY_APP_ID,\n    type: "appstore",\n    readonly: true\n)\n\nsettings_to_override = {\n  :BUNDLE_IDENTIFIER => MY_APP_ID,\n  :PROVISIONING_PROFILE_SPECIFIER => MY_PROFILE,\n  :DEVELOPMENT_TEAM => MY_TEAM\n}\n\ngym(\n    workspace: WORKSPACE_PATH,\n    scheme: "Foo",\n    configuration: "Production",\n    xcargs: settings_to_override,\n    export_method: "app-store",\n    export_options: {\n        provisioningProfiles: { \n            MY_APP_ID => MY_PROFILE\n        }\n    }\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

归功于https://github.com/AliSoftware

\n