使用 fastlane 根据 scheme/target 自动从 plist 获取包标识符

Get bundle identifier from plist automatically based on scheme/target using fastlane

我有一个包含多个 targets/schemes 的 Xcode 项目设置,因此我在同一代码库下有多个应用程序。

我在我的 Fastfile 中创建了以下测试通道,它为我的每个应用程序运行 "sigh" 工具:

lane :testing do
  ["First", "Second", "Third", "Fourth"].each do |scheme_name|
      sigh
  end
end

查看 fastlane 文档,我看到您可以定义 sigh 使用的包标识符。但我需要它自动从每个 target/scheme 的 plist 中获取当前的包标识符,并将其用于 sigh。这能实现吗?

类似于(伪代码):

bundle_id = get_bundle_id_from_plist
sigh(app_identifier: bundle_id)

我尝试使用这个插件:https://github.com/SiarheiFedartsou/fastlane-plugin-versioning 它有一个获取 plist 路径的方法。然后我 运行 这个代码:

bundle_id = get_info_plist_value(path: get_info_plist_path(target: scheme_name), key: 'CFBundleIdentifier')
puts bundle_id

输出是 $(PRODUCT_BUNDLE_IDENTIFIER),这实际上是 plist 值中的内容,所以我越来越接近了。但我需要这个 return 实际的包 ID,而不仅仅是它指向的变量。

我想使用 sigh 的全部原因是因为每个 app/target 都有自己的配置文件,由于 CarPlay 权利,我最初不得不手动生成这些配置文件。我希望它在每个目标过期时自动为每个目标创建新的配置文件。

我不知道有任何 fastlane 操作提供此类功能,但您可以构建一个本地 fastlane action, or create and share a fastlane plugin, that provides the CFBundleIdentifier using the code that updates an info plist using the scheme name 作为示例。

此代码使用 xcodeproj Ruby gem 从方案中获取 Info.plist 文件。然后它更改 plist 值,然后保存 plist 文件。除了 plist 中的 return 和 CFBundleIdentifier 之外,您可以做类似的事情。

如果您不想创建插件,我可以在本周晚些时候创建它,因为我对此很感兴趣。

在我完成插件之前,这段代码应该对你有用:

    # At the top of your Fastfile; you may need to add "gem 'xcodeproj'" to your Gemfile and then do a bundle install
    require 'xcodeproj'

    def product_bundle_id(scheme)
      project = Xcodeproj::Project.open('path/to/your/xcodeproj')
      scheme = project.native_targets.find { |target| target.name == scheme }
      build_configuration = scheme.build_configurations.first
      build_configuration.build_settings['PRODUCT_BUNDLE_IDENTIFIER']
    end

    lane :testing do
      ["First", "Second", "Third", "Fourth"].each do |scheme_name|
        sigh(app_identifier: product_bundle_id(scheme_name))
      end
    end