从其他目标获取Bundle ID

dji*_*i33 19 xcode objective-c target ios ios8

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

现在我正在为iOS 8构建Today Extension.这是一个需要自己的bundle标识符的新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
Run Code Online (Sandbox Code Playgroud)

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

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

Ale*_*xis 24

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

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

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

$(PARENT_APP_BUNDLE_IDENTIFIER).$(PRODUCT_NAME:rfc1034identifier)
Run Code Online (Sandbox Code Playgroud)

它对我来说非常好.

  • 请澄清这一部分:“为所有方案设置正确的捆绑包ID” (2认同)
  • 不适合我。`$(PRODUCT_BUNDLE_IDENTIFIER)` 由项目定义,每个目标都可以设置和读取其值。在您的应用程序扩展中,您读取变量 ,获取并设置自身。它没有任何意义。 (2认同)

小智 6

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

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

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