iOS - watchOS App 发布问题 CFBundleIdentifier 冲突

标签 ios xcode cocoapods watchos carthage

应用上传后我收到以下邮件

We identified one or more issues with a recent delivery for your app, XXX. Please correct the following issues, then upload again.

ITMS-90806: CFBundleIdentifier collision - Each bundle must have a unique bundle identifier. The bundle identifier 'org.cocoapods.CocoaLumberjack' is used in the bundles '[CocoaLumberjack.framework, CocoaLumberjack.framework]'

CocoaLumberjack 是一个第三方库,我过去已经使用过很多次,没有任何问题,我很困惑。

与框架的.plist关键字CFBundlePackageType无关 正如此问题/答案中指定的那样 Framework CFBundleIdentifier Collision . CocoaLumberjack bundle 类型是“框架”(CFBundlePackageType = FMWK)。 CocoaLumberjack 是一个广泛使用的第三方库,已添加到我使用 cocoapods 的项目中。

这个问题可能与我的应用程序包中的 watchOS 目标有关。 CocoaLumberjack 库同时用于 iOS 应用程序和 watchOS 应用程序,它导致了 bundle 标识符重复的问题。

如果在 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 是两者中唯一存在的库。

我过去已经多次发布我的应用程序,但相同的库配置没有任何问题。我猜想苹果最近几天改变了一些关于包标识符的限制。

使用 Carthage 也存在同样的问题。

最佳答案

作为临时解决方法,我手动重命名了 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 包标识符,否则某些库将无法正常运行。

我建议只重命名被 Apple 拒绝的库,以尽量减少可能出现的问题。

目前有一些关于这个问题的不同开放线程:

使用 Carthage 而不是 Cocoapods 也存在类似的问题

如果 Apple 不更改有关 bundle 标识符的新政策,那么 cocoapods 团队可能会提供更干净的解决方案。

关于iOS - watchOS App 发布问题 CFBundleIdentifier 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57723390/

相关文章:

ios - 如何使用自动布局以编程方式修复所有 iPhone 英寸中的文本字段和按钮

xcode - 如何在 Xcode 中获取智能选项卡 ("indent with tabs, align with spaces") 行为?

github - 由于私有(private) pod 从私有(private)存储库作为二进制文件提供,因此 Pod 安装失败

ios - Xcode 10.0 GM - dyld : lazy symbol binding failed: can't resolve symbol ___cxa_guard_acquire crash. 在那之前工作正常

ios - 将UIColor作为字符串存储在NSMutableArray中,但无法显示颜色

ios - 使用 NSDateFormatter 的日期格式化问题

ios - 上传到S3存储桶Swift 3问题

ios - 由于 "UIRequiredDeviceCapabilities",从 ItunesConnect 中删除应用程序并作为新应用程序提交

Objective-C:引用创建类的类

使用 Firebase pod 的 Xcode 12。词法或预处理器问题。 "pb.h' 文件未找到 <angled> 包含;使用 "quotes"代替”?