使用 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 的登录会话?