如何修复 iOS/Xcode 构建错误,未定义符号“__C.NSURLSession.DataTaskPublisher”?

Aug*_*aas 0 xcode ios swift react-native

添加 cocoapods 依赖项时,我们开始收到如下构建错误:

Undefined symbols for architecture x86_64:
  "type metadata accessor for (extension in Foundation):__C.NSURLSession.DataTaskPublisher", referenced from:
      (extension in TinyNetworkingObjcIO):__C.NSURLSession.load<A>(TinyNetworkingObjcIO.Endpoint<A>) -> Combine.AnyPublisher<A, Swift.Error> in libTinyNetworkingObjcIO.a(Endpoint.o)
      lazy protocol witness table accessor for type (extension in Foundation):__C.NSURLSession.DataTaskPublisher and conformance (extension in Foundation):__C.NSURLSession.DataTaskPublisher : Combine.Publisher in Foundation in libTinyNetworkingObjcIO.a(Endpoint.o)
  "protocol conformance descriptor for (extension in Foundation):__C.NSURLSession.DataTaskPublisher : Combine.Publisher in Foundation", referenced from:
      lazy protocol witness table accessor for type (extension in Foundation):__C.NSURLSession.DataTaskPublisher and conformance (extension in Foundation):__C.NSURLSession.DataTaskPublisher : Combine.Publisher in Foundation in libTinyNetworkingObjcIO.a(Endpoint.o)
  "(extension in Foundation):__C.NSURLSession.dataTaskPublisher(for: Foundation.URLRequest) -> (extension in Foundation):__C.NSURLSession.DataTaskPublisher", referenced from:
      (extension in TinyNetworkingObjcIO):__C.NSURLSession.load<A>(TinyNetworkingObjcIO.Endpoint<A>) -> Combine.AnyPublisher<A, Swift.Error> in libTinyNetworkingObjcIO.a(Endpoint.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

在我们向 Podfile 添加新的依赖项后,这些错误就显得有点“出乎意料”,没有关于导致这些错误的原因以及它源自代码的哪一部分的信息,它们只是在构建之后和构建期间打印出来。链接阶段,现在失败了。

这个错误是什么意思?可以采取什么措施来尝试解决这个问题?

这恰好是一个反应本机生成的 XCode 项目,不确定这是否相关。

Aug*_*aas 6

问题似乎是我们的项目(由 生成react-native init)已LIBRARY_SEARCH_PATHS设置为以下内容:

LIBRARY_SEARCH_PATHS = "$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)" "$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)" "$(inherited)"
Run Code Online (Sandbox Code Playgroud)

如果生成普通 Xcode 项目,则不会设置 LIBRARY_SEARCH_PATHS。

事实证明,我们添加的依赖项需要 Swift 5.1,因为它与旧版本的 Swift 不具有二进制兼容性。这导致了破坏,因为 swift 5.0 由于某种原因被明确添加到项目中react-native init。也许这里的具体问题是编译代码的命名约定已经改变,而 Swift 5.1 期望URLSession.DataTaskPublisher而不是NSURLSession.DataTaskPublisher?谁知道..

只需将其清理LIBRARY_SEARCH_PATHS干净,将其清空即可为我们解决问题。如果没有它,构建在其他方面也能正常工作。

相关拉取请求:https://github.com/facebook/react-native/pull/29178