0

我正在尝试为 iOS 项目更新 Facebook SDK。

最初我有版本 11.2.1。有了这个,一切都像魅力一样。

更新到 12.3.1(最新)后,它可以很好地用于调试。但是,当尝试为 Release 构建时,它会失败并出现以下错误。

<unknown>:0: error: module map file '/Users/XXX/Library/Developer/Xcode/DerivedData/App/Build/Products/Release-iphoneos/FBSDKCoreKit/FBSDKCoreKit.modulemap' not found
<unknown>:0: error: module map file '/Users/XXX/Library/Developer/Xcode/DerivedData/App/Build/Products/Release-iphoneos/FBSDKLoginKit/FBSDKLoginKit.modulemap' not found
<unknown>:0: error: module map file '/Users/XXX/Library/Developer/Xcode/DerivedData/App/Build/Products/Release-iphoneos/FBSDKShareKit/FBSDKShareKit.modulemap' not found

版本 12.0.0(这是 11.2.1 之后的下一个版本)也失败了。

我尝试通过 CocoaPods 和 SPM 安装 SDK(详见此处)。在这两种情况下都失败了。

开发环境/设置:

  • MacOS 大苏尔 11.5.2
  • 在装有 iOS 14.8.1 的 iPhone 11 上进行测试
  • 尝试使用 Xcode 12.5.1 和 13.2.1
  • 项目使用 Swift 5
  • 项目的部署目标设置为 iOS 13.0

在 Stack Overflow、SDK repo和 SDK old repo中有几个关于此错误的报告。检查它们后,我测试了以下所有内容,但均未成功:

  • 我正在打开 .xcworkspace,而不是 .xcproject(如此处所述
  • 我在项目、目标和 Pod 中设置了相同的 iOS 版本(如此所述)
  • 我已经执行了几次全面清理(pod clean + deintegrate、Product > Clean Build Folder in Xcode 以及删除 Derived Data 文件夹)。
  • 我尝试将验证工作区设置为是(如此所述)
  • 我已经尝试过在许多线程中解释的排除架构设置搞乱,但没有奏效(这并不让我感到惊讶,因为这些设置是针对在模拟器中运行的,而我正在使用真实设备这样做)。
  • 即使对于发布模式,我也将“仅构建活动架构”设置为是(如此所述)
  • 我在 Podfile 安装后玩过以下内容(建议在这里
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      # Initially I only had this, which ensures that Pods have iOS 13.0 as target
      if config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].to_f < 13.0
        config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
      end
      
      # Then I also tried this
      config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
      
      # Also tried setting this
      config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"

      # As well as this
      config.build_settings[“EXCLUDED_ARCHS[sdk=iphonesimulator*]“] = “arm64”
    end
  end
end
4

1 回答 1

0

我终于能够解决这个问题。我无法在新项目上重现该问题,因此它必须是我现有项目的配置中的某些内容,或者是 Xcode 的某些缓存问题。最后,还是前者。

在我为 Release 配置的目标中,前往 Build Settings > Swift Compiler - Custom Flags > Other Swift Flags (OTHER_SWIFT_FLAGS) 我有以下值:

-Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/FBSDKCoreKit/FBSDKCoreKit.modulemap"
-Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/FBSDKLoginKit/FBSDKLoginKit.modulemap" 
-Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/FBSDKShareKit/FBSDKShareKit.modulemap"

我删除了它们......问题解决了!

我不知道为什么这些值首先存在,因为这个项目是由另一个开发人员启动的。但是,SDK 11.X 版本似乎也不需要它们。

但是,它们在 11.X 版本中工作但在 12.X 中不工作的原因是模块映射实际上并没有出现在后面版本的 Build 目录中。也就是说,对于 11.X 版本,我们可以在 DerivedData 目录中看到以下内容:

$ ls -l DerivedData/XXX/Build/Products/Release-iphoneos/FBSDKCoreKit
FBSDKCoreKit.modulemap
FBSDKCoreKit-umbrella.h
// And a few more files

在 12.X 版本中,只有这样:

$ ls -l DerivedData/XXX/Build/Products/Release-iphoneos/FBSDKCoreKit
PackageFrameworks

我对 iOS 开发相当陌生,所以我不确定为什么会发生这种情况。但我想这与12.0.0 版本中引入的这种变化有关

从版本 12.0.0 开始,CocoaPods 和 Swift 包管理器 (SPM) 正在出售预构建的 XCFrameworks。使用 CocoaPods 或 SPM 时,您不再需要构建 SDK,每次构建可以节省几秒钟到几分钟的时间。

于 2022-02-04T17:44:58.497 回答