【问题标题】:iOS - watchOS App publishing issue CFBundleIdentifier collisioniOS - watchOS App 发布问题 CFBundleIdentifier 冲突
【发布时间】:2020-01-03 12:14:57
【问题描述】:

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

我们发现您的应用最近交付的一个或多个问题, XXX。请更正以下问题,然后重新上传。

ITMS-90806:CFBundleIdentifier 冲突 - 每个捆绑包必须有一个 唯一的捆绑标识符。捆绑标识符 'org.cocoapods.CocoaLumberjack' 用于捆绑 '[CocoaLumberjack.framework, CocoaLumberjack.framework]'

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

与框架的 .plist 关键字 CFBundlePackageType 无关 正如在这个问题/答案Framework CFBundleIdentifier Collision 中指定的那样。 CocoaLumberjack 捆绑包类型为“Framework”(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 是两者中唯一存在的一个。

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

使用 Carthage 也会出现同样的问题。

【问题讨论】:

    标签: ios xcode cocoapods watchos carthage


    【解决方案1】:

    只需从您的扩展中删除嵌入框架构建阶段。

    单击目标部分中的扩展 -> 构建阶段 -> 删除嵌入 pod 框架

    见附图:

    【讨论】:

    • 如果我删除了嵌入框架操作,那么扩展应用程序将不再工作,因为它不再能够找到库
    【解决方案2】:

    作为一种临时解决方法,我手动重命名了 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
    

    注意重命名 pod 包标识符,因为某些库在其他情况下的行为不正确。

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

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

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

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

    【讨论】:

    • 我看到苹果论坛上的整个讨论帖都被版主拒绝了。所以它不再可用。幸运的是,我们可以在这里继续讨论它:-)
    【解决方案3】:

    显然,Apple 更改了验证流程。看起来他们不允许应用内的平台特定框架具有相同的标识符。

    论坛上也有一个帖子:https://forums.developer.apple.com/thread/122048

    如果您因为使用 Cocoapods 而遇到此问题,您可以修补您的 Podfile 以将平台名称附加到包标识符,以便它们始终是唯一的 (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 附加到标识符中。

    【讨论】:

    • 我在 Apple 论坛上打开了帖子:我仍在尝试了解哪个是此问题的最佳解决方案,同时更改捆绑包名称的解决方法看起来不错
    • 注意重命名所有 pod 的 bundle 标识符,因为某些 pod 的行为不正确。即:有些人在使用 Firebase 时遇到了问题,问题是脚本重命名了它的包。我建议只重命名被 Apple 拒绝的那些。
    • Apple 刚刚批准了我们使用我的回答中描述的技术的应用更新。
    • 我并不是说这是错误的,因为它是处理这个问题的正确方法:-) ...请注意它不能对每个库都正常工作。
    • 当我在实施此方法后尝试归档构建时,我收到以下错误:“无效的代码签名标识符。代码签名中的标识符必须与其捆绑标识符匹配。”
    【解决方案4】:

    你不需要改变每个目标,写这样的东西更干净:

    post_install do |installer|
      installer.pods_project.targets.each do |target|
        if target.platform_name == :watchos
          target.build_configurations.each do |config|
            config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = 'org.cocoapods.${PRODUCT_NAME:rfc1034identifier}-$(PLATFORM_NAME)'
          end
        end
      end
    end
    

    【讨论】:

      【解决方案5】:

      以下是我为 Carthage 解决问题的方法。

      1) 创建一个 Carthage 构建脚本,将不同的 Carthage 构建阶段分开

      2) 当您进行实际的框架构建时;首先为 iOS 构建有问题的框架(我只有一个),然后修改您的项目文件以更改捆绑标识符,然后为 watchOS 构建这些框架,然后构建其余的框架

      carthage bootstrap --no-checkout
      carthage checkout
      #undo previous CFBundleIdentifier changes
      sed -i '' 's/com.someco.MyFramework.watchOS;/com.someco.MyFramework;/g' Carthage/Checkouts/MyFramework/MyFramework.xcodeproj/project.pbxproj
      carthage build --cache-builds --platform iOS
      #set a unique CFBundleIdentifier
      sed -i '' 's/com.someco.MyFramework;/com.someco.MyFramework.watchOS;/g' Carthage/Checkouts/MyFramework/MyFramework.xcodeproj/project.pbxproj
      carthage build --no-use-binaries --platform watchOS --configuration $CONF $VERBOSE MyFramework
      
      

      【讨论】:

        【解决方案6】:

        一个选项是 - 您可以手动将“.watchos(abc.asd.alomofire.watchos) 添加到手表包标识符。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-08-04
          • 2015-06-17
          • 1970-01-01
          • 2015-06-18
          • 2017-09-18
          • 1970-01-01
          • 2021-09-08
          相关资源
          最近更新 更多