【问题标题】:Xcode 7: changing product bundle identifierXcode 7:更改产品包标识符
【发布时间】:2015-12-28 00:18:18
【问题描述】:

我正在设置 Jenkins 以自动化构建过程。特别是,为了我的需要,我希望能够设置不同的包标识符。

我正在使用 Xcode Jenkins 插件来设置包标识符:

问题在于这将更改 Info.plist 文件和 MyTarget > General > Bundle Identifier 中的包标识符。但它不会更改 Build Settings > Packaging > Product Bundle Identifier 中的包标识符。

如果我手动执行,也会发生同样的事情。 我在 Xcode 7 中创建了一个新项目。默认情况下,三个值是:

当我像这样更改Info.plist 文件中的值时:

另外两个值为:

因此,您如何查看构建设置中的值并没有改变。如果我在 Xcode 中,我会手动更改该值,但如果我在 Jenkins 中构建项目,这是一个 bis 问题。

有人遇到过同样的问题吗?你是怎么解决的?

谢谢!

【问题讨论】:

  • 从今天开始遇到同样的问题。我使用plistbuddy shell 命令来更改包标识符。它会更改 info.plist,但不会更改 xCode 中构建设置中的包标识符。
  • 感谢,没想到要改3个地方!

标签: xcode jenkins jenkins-plugins xcode7 bundle-identifier


【解决方案1】:

如果您使用bundle id suffixes,请不要在Target SettingsGeneral 选项卡上设置Product Bundle Identifier

Build Settings 标签上设置它。

例如:

com.company.app${BUNDLE_ID_SUFFIX}

【讨论】:

    【解决方案2】:

    面临同样的问题。

    PRODUCT_BUNDLE_IDENTIFIER 是您的project.pbxproj 文件中的一个变量。将其更改为您想要的任何内容,它将反映在您的 Info.plist 以及项目设置中。

    【讨论】:

    • 所以我应该将PRODUCT_BUNDLE_IDENTIFIER=$CB_APP_ID 传递给xcodebuild,对吧?
    • 那行得通。作为记录,我将PRODUCT_BUNDLE_IDENTIFIER=$CB_APP_ID 传递给xcodebuild 命令。
    • 你是如何添加这个PRODUCT_BUNDLE_IDENTIFIER=$CB_APP_ID的?
    • 我在Custom xcodebuild arguments 中添加了类似:PRODUCT_BUNDLE_IDENTIFIER = 'com.w.test' 但在构建设置中没有改变:(
    • @LucaTorella 你能帮忙吗
    【解决方案3】:

    您还可以通过转到 Targets 并选择“Levels”来查看纯文本数据,这将显示包含 Bundle Identifier 的列。

    【讨论】:

      【解决方案4】:

      对于 xcode 8.x

      在 Targets > your_app_name - Info > 添加新属性键下更改应用名称​​不会在整个项目中对应用名称进行全面更改

      当您执行此操作时,您的项目仅在您的 mac 中运行顺利(即,在您用于进行这些更改的系统中,因为您的所有属性键和身份都将保存在您的系统中)。当您尝试在另一个系统中使用您的项目时,如果您在项目中使用 pod,您会收到这个奇怪的错误,即您的项目丢失了。

      因此,要克服这个问题,您只需在构建设置中进行一些更改,保持“常规”选项卡和“信息”选项卡不变。

      Targets > Build settings下,滚动到Packaging

      将您的产品名称更改为所需的名称,并将产品包标识符更改为新名称。完成此操作后,您的项目显示名称和包 ID 会自动更改为“常规”选项卡中的新名称。

      【讨论】:

      • 我正在使用 XCode 9,但这不起作用。应用在模拟器中启动时会爆炸。
      【解决方案5】:

      请参阅this 以获取使用 shell 命令替换 $PRODUCT_BUNDLE_IDENTIFIER 的简单解决方案 -

      sed -i '' 's/com.example.oldbundleid/com.example.newbundleid/g' project.pbxproj

      您可以使用 Jenkins/Shell 相应地传递您的变量。

      另一种方法是使用mod-pbxproj

      python -m mod_pbxproj -b -af PRODUCT_BUNDLE_IDENTIFIER=com.example.newbundleid -rf PRODUCT_BUNDLE_IDENTIFIER=com.example.oldbundleid project.pbxproj All

      //编辑

      旧的 bundle id 可以通过 -

      获取

      awk -F '=' '/PRODUCT_BUNDLE_IDENTIFIER/ {print $2; exit}' project.pbxproj

      这可以存储在字符串变量中并用于代替com.example.oldbundleid

      【讨论】:

      • 如果您不需要知道旧的包标识符的解决方案会更好。
      • 更新了我的解决方案。它从.pbxproj 获取存储的捆绑包ID 值以替换。 @turingtested
      【解决方案6】:

      udit's answer 是正确的。最佳实践是在 plist 中将 Bundle ID 值设置为 $PRODUCT_BUNDLE_IDENTIFIER。然后在 Build Settings 中,使用不同的配置(Debug、Release .etc)根据需要设置不同的 bundle ID:

      您不再需要 xCode 插件来更改捆绑包 ID,但需要在其中指定配置。

      【讨论】:

      • 在大多数情况下这是最佳实践,我同意。但我希望所有这些参数都是可定制的。基本上我想要一个网络界面,客户可以添加 p12 文件、移动配置文件、捆绑标识符,他们将获得自定义的 .ipa
      • @Aoke Li- 这似乎是一个更好的方法。我对此只有一个疑问。当我根据构建配置使用不同的包标识符时,哪个值将反映在 Xcode 摘要常规窗格中?
      • @Rashmi Ranjan mallick- 因此,在您设置配置文件并在本地构建之后,您会注意到常规窗格中的捆绑包 ID 也得到了更新。而且由于该区域的 jekins 构建时间没有注入任何内容,因此从站将完全像您的开发机器一样工作。
      • @AokeLi- 实际上,我没有使用 Jenkins。我正在使用存档功能手动构建。我的场景是 - 我想为不同的配置使用不同的包 ID(如您所演示的)。
      • 如果您在项目中构建第 3 方依赖项,这将失败,因为所有模块必须就构建配置达成一致。大多数只支持默认的调试和发布。 ://
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多