Xcode 7:更改产品包标识符

50

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

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

Jenkins Xcode plugin - Code signing & OS X keychain options

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

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

Info plist beforetarget general beforepackaging

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

Info plist changed

其他两个值将变为:

target general after packaging after

因此,您可以看到“Build Settings”中的值不会更改。如果我在Xcode中手动更改该值,但如果我在Jenkins中构建项目,则这是一个大问题。

有人遇到了同样的问题吗?你如何解决它?

谢谢!


今天开始遇到相同的问题。我使用plistbuddy shell命令来更改捆绑标识符。它更改了info.plist,但没有在xCode中的构建设置内更改捆绑标识符。 - Sarthak Singhal
非常感谢,我没有意识到需要在三个地方进行更改! - JOM
6个回答

36

面对同样的问题。

PRODUCT_BUNDLE_IDENTIFIER 是您的 project.pbxproj 文件中的一个变量。将其更改为所需内容,它将同时反映在您的 Info.plist 和项目设置中。


所以我应该将 PRODUCT_BUNDLE_IDENTIFIER=$CB_APP_ID 传递给 xcodebuild,对吧? - Luca Torella
那个可行。记录一下,我正在将 PRODUCT_BUNDLE_IDENTIFIER=$CB_APP_ID 传递给 xcodebuild 命令。 - Luca Torella
你是如何以及在哪里添加了这个 PRODUCT_BUNDLE_IDENTIFIER=$CB_APP_ID 的? - Pooja M. Bohora
我已经添加了“自定义xcodebuild参数”,例如:PRODUCT_BUNDLE_IDENTIFIER = 'com.w.test',但是它在构建设置中没有改变 :( - Pooja M. Bohora
@LucaTorella,你能帮忙吗? - Pooja M. Bohora
是的,这只是一个额外的 xcodebuild 参数。xcodebuild PRODUCT_BUNDLE_IDENTIFIER="com.w.test" - Luca Torella

29

udit的回答是正确的。最佳做法是在plist中将Bundle ID值设置为$PRODUCT_BUNDLE_IDENTIFIER。 然后,在构建设置中,使用不同的配置(Debug、Release等)按需设置不同的bundle ID:

输入图像描述

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

输入图像描述


2
在大多数情况下,这是最佳实践,我同意。但我希望所有这些参数都可以定制。基本上,我想要一个Web界面,客户可以添加p12文件、移动配置文件、捆绑标识符,然后他们将获得一个定制的.ipa文件。 - Luca Torella
1
@Aoke Li- 这似乎是一个更好的方法。我只有一个疑问。当我根据构建配置使用不同的捆绑标识符时,哪个值将反映在Xcode摘要常规窗格中? - Rashmi Ranjan mallick
@Rashmi Ranjan Mallick- 所以在您设置配置文件并本地构建之后,您会注意到常规面板中的捆绑标识也已更新。由于在此区域注入了任何内容,因此从机将与开发计算机完全相同。 - Aoke Li
@AokeLi- 实际上,我没有使用Jenkins。我是手动构建,使用归档功能。我的情况是- 我想为不同的配置使用不同的捆绑标识符(就像您演示的那样)。 - Rashmi Ranjan mallick
如果您正在构建项目中的第三方依赖项,则此方法会失败,因为所有模块都必须同意构建配置。大多数仅支持默认的Debug和Release。 :/ - quickthyme

15

参考这篇文章,使用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

//编辑

可以使用以下命令获取旧的包标识:

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

这可以存储在字符串变量中,并用作com.example.oldbundleid的位置。


1
最好的解决方案是您无需知道旧包标识符。 - turingtested
更新了我的解决方案。它从.pbxproj中获取存储的包ID值进行替换。@turingtested - Sarthak Singhal

3

对于xcode 8.x

在Targets > your_app_name - Info下更改应用名称并添加新的属性键不能使项目中的所有地方都完全更改应用名称

当您在Mac上独自运行项目时(即,在您用于进行这些更改的系统中),您的项目可以顺利运行,因为您的所有属性键和身份标识都将保存在您的系统中。但是,如果使用pods,当您尝试在另一个系统中使用项目时,您会收到项目丢失的奇怪错误。

为了解决这个问题,您需要在Build设置中进行一些更改,保留General和Info选项卡不变。

Targets > Build settings下,滚动到Packaging

Product name更改为所需名称,将Product bundle identifier更改为新名称。这样一来,自动将在General选项卡中更改项目显示名称和绑定ID。


我正在使用XCode 9,但这个程序无法运行。在模拟器中启动应用时会崩溃。 - Logicsaurus Rex

2

如果您使用,请勿在目标设置常规选项卡上设置产品包标识符

请在构建设置选项卡上进行设置。

例如:

com.company.app${BUNDLE_ID_SUFFIX}

0

您还可以通过转到目标并选择“级别”来查看纯文本中的数据,其中将显示包标识符所在的列。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接