应用上传后,我收到以下电子邮件
我们发现您的应用“ XXX”最近交付时出现了一个或多个问题。请更正以下问题,然后重新上传。
ITMS-90806:CFBundleIdentifier冲突-每个捆绑包必须具有唯一的捆绑包标识符。捆绑包标识符“ org.cocoapods.CocoaLumberjack”用于捆绑包“ [[CocoaLumberjack.framework,CocoaLumberjack.framework]””中
CocoaLumberjack是一个第三方库,我在过去已经使用了很多次而没有任何问题,我很困惑。
它与框架的.plist关键字CFBundlePackageType无关,因为此问题/答案是框架CFBundleIdentifier Collision中指定的。CocoaLumberjack捆绑包的类型为“框架”(CFBundlePackageType = FMWK)。CocoaLumberjack是使用cocoapods添加到我的项目中的广泛使用的第三方库。
该问题可能与我的应用程序包中的watchOS目标有关。CocoaLumberjack库在iOS应用程序和watchOS应用程序中都使用,这引起了有关捆绑标识符重复的问题。
如果iOS目标和Watch Extension之间共享框架,则Apple Connect服务器会检测到CFBundleIdentifier冲突。
target 'App' do platform :ios, '9.0' # Pods for App ... pod 'CocoaLumberjack/Swift', '~> 3.5.3' ... end target 'AppWatch Extension' do platform :watchos, '5.0' # Pods for Watch Extension ... pod 'CocoaLumberjack/Swift', '~> 3.5.3' ... end
iOS应用正在使用该库,而watchOS扩展正在使用相同的库。他们使用不同的库,但CocoaLumberjack是两者中唯一的一个。
过去,我已经多次发布我的应用程序,而相同的库配置没有任何问题。我想苹果在最近几天改变了一些关于捆绑标识符的限制。
使用迦太基也存在相同的问题。
作为一种临时的解决方法,我在watchOS扩展中手动重命名了捆绑包标识符,然后应用程序发布可以正常工作,但它看起来不是一个不错的解决方案,尤其是在CI系统上运行构建时。
更好的选择是在pod文件中添加特定的安装后操作:
post_install do |installer| installer.pods_project.targets.each do |target| if target.name == 'CocoaLumberjack-watchOS' target.build_configurations.each do |config| config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}-$(PLATFORM_NAME)' end end end end
或者如果您必须处理多个库:
post_install do |installer| watchosLibs = ['Lib1-watchOS', 'Lib2-watchOS', 'Lib3-watchOS'] installer.pods_project.targets.each do |target| if watchosLibs.include? target.name target.build_configurations.each do |config| config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}.${PLATFORM_NAME}" end end end end
注意重命名pods bundle标识符,因为某些库否则会无法正常工作。
我建议仅重命名Apple拒绝的库,以最大程度地减少可能出现的问题。
当前有一些与此问题有关的开放线程:
在Apple论坛上(当前无可用)
在Cocoapods github项目上
使用迦太基代替可可足类也存在类似的问题
在迦太基github项目上
如果Apple不会更改有关捆绑软件标识符的新政策,那么cocoapods团队可能会提供更干净的解决方案。
显然,Apple更改了验证过程。看起来他们不允许应用程序中的平台特定框架具有相同的标识符。
论坛上也有关于此的帖子:https : //forums.developer.apple.com/thread/122048
如果由于使用Cocoapods而遇到此问题,则可以修补Podfile,以将Platform Name附加到包标识符中,以便它们始终是唯一的(source):
post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}-$(PLATFORM_NAME)' end end end
如果您的应用程序中有多个目标,则可以在XCode中更改方案中的watchOS目标,并附.watchos
加到标识符。