从其他目标获取Bundle ID

时间:2014-09-11 18:27:38

标签: ios objective-c xcode ios8 target

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

现在我正在构建适用于iOS 8的Today Extension。它是一个需要自己的捆绑标识符的新Target。

Extension的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

有没有办法可以通过首先查看Parent目标的包标识符来配置我的Today Extension目标来设置其包标识符?也许是通过自定义的运行脚本构建阶段?

3 个答案:

答案 0 :(得分:23)

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

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

然后,在应用扩展目标的信息标签中,将包ID设置为

$(PARENT_APP_BUNDLE_IDENTIFIER).$(PRODUCT_NAME:rfc1034identifier)

它对我来说非常好。

答案 1 :(得分:2)

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

让我们说大约有10个“应用”目标,我无法想象每个主要目标都会添加Notification Content和Notification Service扩展(在这种情况下,我总共将维护30个目标-疯狂)。

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

答案 2 :(得分:0)

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

  1. 选择“编辑方案”
  2. 点击“构建”附近的三角形
  3. 选择“预行动”
  4. 点击“ +”,选择“新运行脚本操作”
  5. 选择目标以从中提供构建设置
  6. 在脚本字段中粘贴以下ID和扩展名文件夹
// Aggregate root

@GetMapping("/user")
List<User> all() {
    return repository.findAll();
}

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