错误 ITMS-90685:“CFBundleIdentifier 冲突。有多个捆绑包”
Posted
技术标签:
【中文标题】错误 ITMS-90685:“CFBundleIdentifier 冲突。有多个捆绑包”【英文标题】:ERROR ITMS-90685: "CFBundleIdentifier Collision. There is more than one bundle" 【发布时间】:2017-02-21 15:22:51 【问题描述】:当我尝试将我的应用提交到应用商店时,我收到错误消息:
ERROR ITMS-90685:“CFBundleIdentifier 冲突。有超过 一个具有 CFBundleIdentifier 值的捆绑包 com.companyname.projectName 下应用 ProjectName.app"
谁能帮帮我?
【问题讨论】:
【参考方案1】:原因
如果您的 HostApp 嵌入了一个框架,该框架也嵌入在一些框架中,这些框架也嵌入在 HostApp 中,就会发生这种情况。例如,
-
主机
H
嵌入框架F1
和框架F2
框架F1
嵌入框架F2
因此,框架F2
将在 IPA 生成后复制到包中
解决方案
只有 HostApp 而没有其他框架应该在它们各自的构建阶段嵌入任何依赖的框架。所以,
-
转到
F1
的构建阶段选项卡
从Embed Frameworks
步骤中删除F2
,或删除整个步骤
转到F1
的常规选项卡
选择框架、库和嵌入式内容
为F2
选择Do Not Embed
选项
有一个干净的构建。
【讨论】:
我不需要更改构建阶段设置。我只需要为我的每个框架和应用程序扩展目标的General
设置下列出的所有框架选择Do Not Embed
选项。
对我来说没有“不嵌入”选项。我已经使用 SPM 在我的项目中添加了放大框架。我的共享扩展也需要这个,所以我去共享扩展通用和“框架和库”并手动添加库。它可以构建并运行,但无法存档并出现冲突错误。这里的解决方案似乎对我不起作用,因为我在库旁边没有“不嵌入”选项。
此解决方案适用于重复的框架,但 SPM 依赖项最终是静态库,您不能“不嵌入”那些。【参考方案2】:
有时这与应用扩展无关,在没有任何应用扩展的应用中,这可能源于您在生成的 IPA 中复制框架。
就我而言,问题是我正在导入一个框架 A,其中包含其他两个框架 B 和 C,它们都在同一个工作区中。在应用程序中,我导入了 A、B、C,但在框架 A 中,框架 B 和 C 嵌入了 Embed & sign,这是不正确的,它导致了问题。它应该与 Do not embed 一起添加。
【讨论】:
你会认为 xcode 在上传到 itms 阶段之前会发出警告! 谢谢,这个答案解决了我的问题! 我无法为 xcframework 设置不嵌入,我被卡住了。我在框架和应用程序中也使用了 alamofire 和 ziparchive。你有什么建议吗? 我遇到了这个依赖最终成为静态库的问题,你不能将它们设置为不嵌入。【参考方案3】:没有脚本的步骤:
打开 (Your App).xcodeproj 文件(这是项目导航器窗格中的第一个文件)。 切换到应用扩展的目标(在中间窗格的左上角)。 转到构建阶段选项卡 点击“嵌入 Pod 框架”后的 X【讨论】:
帮助。原因是:只有第一个上传的项目需要"Pod Frameworks"。之后,其余具有相同标识符的库将从第一个库中获取。 也适用于 SPM。 SPM 的库应标记为.dynamic
。
如何将 SPM 库标记为 .dynamic?【参考方案4】:
这似乎是一个长期存在的错误,甚至在 Swift 包管理器中也存在。对于扩展的构建阶段,我添加了这个“运行脚本”作为最后一步:
cd "$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/"
if [[ -d "Frameworks" ]]; then
rm -fr Frameworks
fi
这将删除它在归档期间抱怨的重复框架,无论如何它将与主机目标链接。我们只需要在 Xcode 中为扩展链接它,这样我们就可以在开发时进行编译。
【讨论】:
没有其他方法对我有用,所以我正在尝试使用 SPM 添加的包的此解决方案,但我以前从未使用过脚本。所以我去了我的扩展构建阶段按加号添加运行脚本并粘贴上面的代码不变。但是错误仍然存在。我还需要做些什么来添加这个脚本吗? 这个脚本对我也不起作用。也许有什么错误?【参考方案5】:您的应用中有应用扩展吗? 由于 App Extension 文件夹中的 Cocoapods 嵌入式框架,我遇到了这个错误。
您需要从扩展目标中删除构建阶段'[CP] Embed Pods Frameworks'
。
我为此编写了这样的 ruby 脚本:
# remove.rb
require 'xcodeproj'
project_path = "Keyboard.xcodeproj"
project = Xcodeproj::Project.open(project_path)
project.targets.each do |target|
puts target.name
if target.name.include?("Extension")
phase = target.shell_script_build_phases.find |bp| bp.name == '[CP] Embed Pods Frameworks'
if !phase.nil?
puts "Deleting Embed Pods Frameworks phase from #target.name…"
target.build_phases.delete(phase)
end
end
end
project.save
在 CocoaPods 1.1.0 中应该修复:https://github.com/CocoaPods/CocoaPods/issues/4203
【讨论】:
【参考方案6】:如果您有应用扩展,请确保它的包标识符与您应用的包标识符不同。
例子:
没用
App Bundle Identifier: company.myApp
Extension Bundle Identifier: company.myApp
作品
App Bundle Identifier: company.myApp
Extension Bundle Identifier: company.myApp.extension
【讨论】:
嗨@Tim Isenman,说扩展包标识符是 com.xyz.abc ,你建议的“Works”扩展包标识符是什么?我已经尝试了 com.myapp.xyz.abc 和迭代,但无法让它工作以上是关于错误 ITMS-90685:“CFBundleIdentifier 冲突。有多个捆绑包”的主要内容,如果未能解决你的问题,请参考以下文章
将应用程序上传到 iTunes 连接时如何解决 Xcode 验证错误?
远程服务器返回错误: 404错误远程服务器返回错误:500错误 HttpWebResponse远程服务器返回错误:(404500) 错误。
Pig 安装错误:错误 pig.Main:错误 2998:未处理的内部错误