【问题标题】:Get Bundle ID from a different target从不同的目标获取 Bundle ID
【发布时间】:2014-11-05 19:48:54
【问题描述】:

在我的 Xcode 项目中,我有 4 种不同的方案(prod、dev、staging、staging2),它们会更改安装到手机上的应用程序的包标识符。这样我就可以并排安装所有 4 个版本,类似于 this technique

现在我正在为 iOS 8 构建一个 Today Extension。它是一个新的 Target,需要它自己的包标识符。

扩展的Bundle Identifier必须以Parent App的Bundle Identifier为前缀,否则会抛出警告:

error: Embedded binary's bundle identifier is not prefixed with the parent app's bundle identifier.

    Embedded Binary Bundle Identifier:  com.company.app.TodayExtension
    Parent App Bundle Identifier:       com.company.app.staging

在这种情况下,嵌入式二进制包标识符必须是com.company.app.staging.TodayExtension

有没有一种方法可以通过首先查看父目标的捆绑标识符来配置我的 Today Extension 目标以设置其捆绑标识符?也许通过自定义运行脚本构建阶段?

【问题讨论】:

  • 你能更详细地解释一下你是如何解决这个问题的吗?在下面 Jafar 的回答中,您是否能够通过切换方案以某种方式设置 PARENT_APP_BUNDLE_IDENTIFIER,如果可以,如何设置?或者您在每个目标(包括扩展目标)中为捆绑 ID 和 PARENT_APP_BUNDLE_IDENTIFIER 指定了什么?谢谢!
  • 在项目设置中 |构建设置 |用户定义,创建一个名为 PARENT_APP_BUNDLE_ID 的新条目。我有 4 个配置,我为每个配置添加一个值(com.company.app.staging、com.company.app.development 等)。在 Main App Target 的 Info.plist 中,将 Bundle Identifier 设置为 $(PARENT_APP_BUNDLE_ID)。在您的 Extension Target 的 Info.plist 中,将其 Bundle Identifier 设置为 $(PARENT_APP_BUNDLE_ID).NameOfYourExtension。
  • 啊哈,完全错过了这样一个事实,即您通过额外的自定义构建配置(项目 | 信息 | 配置)并在项目级别为每个配置设置不同的 PARENT_APP_BUNDLE_ID 值,而不是认为你以某种方式通过覆盖单个目标设置来做到这一点。所以你仍然可以切换方案来构建 w/不同的包 id,因为每个方案使用不同的构建配置集。很酷,对我有用,可以帮助我清理重复的目标和 plist 文件!
  • 当您在项目级别将 PARENT_APP_BUNDLE_ID 添加到您的构建设置中时,您应该通过单击左侧的三角形来查看下方的所有配置。在我的应用程序中,我有 4 个配置(dev、prod、staging、staging2)。创建用户定义的构建设置后,我看到了所有 4 个配置,并且可以为每个配置分配不同的值。
  • 如果我的扩展嵌入到多个目标怎么办?

标签: ios objective-c xcode ios-app-extension xcode-build-settings


【解决方案1】:

我有 Siri 扩展和多个目标,因此为了避免为每个目标重复扩展,我在构建之前更改扩展 plist 的 BundleId 的每个方案都添加了预操作:

  1. 选择“编辑方案”
  2. 点击“构建”附近的三角形
  3. 选择“预操作”
  4. 点击“+”,选择“新建运行脚本动作”
  5. 选择目标以提供构建设置
  6. 在脚本字段中粘贴您的 BundleId 和扩展文件夹
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier 
YourDesiredBundleId" "$PROJECT_DIR/YourExtensionFolder/Info.plist"

它就像一个魅力!您需要为每个方案配置它。

【讨论】:

  • 对我来说$PROJECT_DIR 不是正确的目录。我不得不改用BUILT_PRODUCTS_DIRBUILD_DIR
  • 非常感谢,现在您有 1000 多个扩展程序非常有帮助。
  • 我们必须在应用目标方案或扩展方案中添加上述脚本吗?我有 5 个应用程序目标并想使用一个服务扩展。那么,我必须在哪里添加这个运行脚本?
  • @KirtiNikam 应用目标方案
【解决方案2】:

在我的项目中,我需要构建不同版本的应用程序(细节不同,例如每个应用程序都有不同的徽标)。

假设有大约 10 个“应用”目标,我无法想象为每个主要目标添加通知内容和通知服务扩展(在这种情况下,我总共会维护 30 个目标 - 疯狂)。

我在“嵌入应用程序扩展”阶段之后运行了一个脚本 (https://gist.github.com/damian-rzeszot/0b23ad87e5ab5d52aa15c095cbf43c59)。它会覆盖应用扩展 plist 中的捆绑包 ID 并重新签署捆绑包。

【讨论】:

  • 你复制所有这些脚本并把它放在 Build Phases 的新 Run Script 中???
【解决方案3】:

目标的构建设置不适用于其他目标。但是,可以使用 PROJECT 的构建设置。

因此,您可以在您的项目中添加用户定义的构建设置并将其命名为 PARENT_APP_BUNDLE_IDENTIFIER 并为您的所有方案设置正确的包 ID。

然后在应用扩展目标的信息选项卡中将捆绑ID设置为

$(PARENT_APP_BUNDLE_IDENTIFIER).$(PRODUCT_NAME:rfc1034identifier)

对我来说效果很好。

【讨论】:

  • 太棒了!这让我省去了很多挫折!
  • 我正在运行同样的问题..我遵循了上述解决方案......但没有成功..我已经更新了 ios 8.0.2 和 xcode 6.0.1(官方版本),以前我有 8.0,因为它可以工作对我来说很好..
  • 请澄清这部分:“为您的所有方案设置正确的捆绑ID”
  • 不适合我。 $(PRODUCT_BUNDLE_IDENTIFIER) 由项目定义,每个目标都可以设置和读取其值。在您的应用程序扩展中,您读取变量,您获取并设置它自己。这没有意义。
  • Alexis,跟进@Mirko 和其他人提出的问题,当您有不同的目标时,这是否解决了问题?当然,我可以为每个配置设置不同的 bundleID。但是如果我有 3 个目标,那么我怎么知道选择了哪个目标?您能否在答案中澄清这一点或添加屏幕截图?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
相关资源
最近更新 更多