使用 fastlane 根据方案/目标自动从 plist 获取包标识符

Posted

技术标签:

【中文标题】使用 fastlane 根据方案/目标自动从 plist 获取包标识符【英文标题】:Get bundle identifier from plist automatically based on scheme/target using fastlane 【发布时间】:2017-03-03 23:20:15 【问题描述】:

我有一个具有多个目标/方案的 Xcode 项目设置,因此我在同一个代码库下有多个应用程序。

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

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

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

类似(伪代码):

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 值中的内容,所以我越来越接近了。但我需要它来返回实际的包 ID,而不仅仅是它指向的变量。

我想要使用 sigh 的全部原因是因为每个应用程序/目标都有自己的配置文件,由于 CarPlay 授权,我必须在最初手动生成这些配置文件。我希望它在每个目标到期时自动为它们创建新的配置文件。

【问题讨论】:

【参考方案1】:

我不知道任何提供此类功能的fastlane 操作,但您可以构建一个本地fastlane action,或创建和共享一个fastlane plugin,使用CFBundleIdentifier 提供CFBundleIdentifier @ 举个例子。

此代码使用xcodeproj Ruby gem 从Scheme 中获取Info.plist 文件。然后它会更改 plist 值,然后保存 plist 文件。除了从 plist 中返回 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

【讨论】:

感谢您的信息。请参阅我更新的答案。我能够返回该值,但它返回的是 $(PRODUCT_BUNDLE_IDENTIFIER) 而不是实际的捆绑包 ID。 不客气!我已经发布了插件。要安装它,请从命令行运行 fastlane add_plugin get_product_bundle_id。有关文档,请参阅 github.com/fastlane/fastlane/blob/master/fastlane/docs/…。要调用它,get_product_bundle_id(project_filepath: project_path, scheme: 'Scheme Name') 再次感谢伙计。您知道如何强制 sigh 将 CarPlay 权利 (com.apple.developer.playable-content = true) 包含在它过期时生成的配置文件中吗?我的应用中的 CarPlay 功能需要它。 不是随手;由于我们目前在内部管理我们的个人资料,所以我不与 sigh 合作 一切都好。是的,我在一个 Xcode 项目中有超过 300 多个应用程序,这就是为什么希望 sigh 可以自动更新过期的配置文件,它可以,但也能够包含该权利。

以上是关于使用 fastlane 根据方案/目标自动从 plist 获取包标识符的主要内容,如果未能解决你的问题,请参考以下文章

Fastlane:如何自动获取 Apple ID 的登录会话?

如何使用 fastlane Fastfile 通道自动化 xcode 清理过程

Fastlane支持苹果双重认证终极解决方案

Fastlane 根据试飞中先前的内部版本号增加内部版本号

iOS - 如何在 fastlane 快照中传递构建参数

Fastlane 从标识符中检索配置文件路径