【问题标题】:React Native XCode Project Product Archive Fails with duplicate symbols for architecture arm64React Native XCode 项目产品存档失败,架构 arm64 的符号重复
【发布时间】:2017-06-20 16:19:27
【问题描述】:

奇怪的是,我似乎无法让存档在 XCode 中工作,但如果我不尝试存档而只是构建发布版本,则构建成功而不会出现重复符号上的错误。该项目也可以在设备上正确构建。

我已经搜索了这个主题并尝试禁用可测试性,并将项目设置中的“No Common Blocks”也设置为 NO,但到目前为止没有运气。

该项目是一个基于 React Native 0.40 的项目,同时安装了 CocoaPods。 PodFile 是这个

# You Podfile should look similar to this file. React Native currently does not support use_frameworks!
source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '8.0'

# Change 'AirMapsExplorer' to match the target in your Xcode project.
target 'StreetSmart' do
  pod 'React', path: '../node_modules/react-native', :subspecs => [
    'Core',
    'RCTActionSheet',
    'RCTAnimation',
    'RCTGeolocation',
    'RCTImage',
    'RCTLinkingIOS',
    'RCTNetwork',
    'RCTSettings',
    'RCTText',
    'RCTVibration',
    'RCTWebSocket'
  ]

  pod 'GoogleMaps'  # <~~ remove this line if you do not want to support GoogleMaps on iOS

# when not using frameworks  we can do this instead of including the source files in our project (1/4):
#  pod 'react-native-maps', path: '../../'
#  pod 'react-native-google-maps', path: '../../'  # <~~ if you need GoogleMaps support on iOS
end

XCode 版本是 8.2.1,项目文件是通过 .xcworkspace 打开的,因为安装了 pod。

非常感谢您对此的任何帮助或见解,被困了几个小时。

【问题讨论】:

  • 开发的包含和/或库路径是否与发布相同?
  • 不太清楚你的意思...我在发布模式下构建应用程序并在设备上运行它没有问题。 Archive 使用 Release 构建配置,但只有 Archive 因这些错误而失败。

标签: ios xcode react-native cocoapods


【解决方案1】:

所以我对此进行了更多研究,解决方法实际上要简单得多。或者至少在我的情况下是这样。问题是,当您在 podfile 中声明 React 时,Pods xcodeproject 会获得一个 React 目标作为pod install 进程的一部分。在 Pods 项目中具有此目标是导致存档时错误的原因。所以解决方法是删除目标。

在 xCode 中删除目标的问题在于,这实际上编辑了 Pods 文件夹中的 project.pbxproj 文件,该文件不在版本控制中。因此,虽然构建将在您执行此操作后存档,但如果您从手动删除它的机器以外的任何地方进行部署,它仍然会失败。所以解决办法是在你的 podfile 的底部添加这个 post install 命令:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.name == "React"
      target.remove_from_project
    end
  end
end

这只是遍历所有要安装的 pod 并删除 React 的目标。这样,构建项目的任何地方也将删除目标。现在,当您构建到存档时,它不会失败。

【讨论】:

  • 我花了好几个小时来追踪这件事。而所有其他选项都会导致“存档”或“运行”被破坏。花了我很长时间才找到为什么 React 被构建了两次,但最终,这解决了它。谢谢@stueynet!
  • @PinguinDirk 太棒了!很高兴听到它。
  • 我把你的建议代码放在了 podfile 的最底部,但是我运行“归档”它仍然给出同样的错误,我应该运行 pod install 吗?
  • 你是我的救星。几个月来我一直在为此苦苦挣扎。
  • 它节省了我的时间。伟大的!谢谢。
【解决方案2】:

在另一个react-native项目here找到相关问题后,终于解决了问题。

答案是Xcode项目中有两份React Native,一份来自CocoaPods,一份作为子项目。只需删除 Xcode 内 Libraries 下 Podfile 中已声明的所有模块,清理并重试后错误就会消失。

这个问题的有趣之处在于,Debug 和 Release 中的所有构建都有效,但在尝试归档项目以进行分发时却失败了。

[2017 年 5 月 2 日更新]

当您使用react-native run-ios/android 运行代码时,我上面描述的解决方案可能会导致调试时错误,尽管它允许项目成功存档。

另一种方法是从Podfile 声明而不是Libraries 文件夹中删除LibrariesPodfile 中存在的那些重复模块。当然还有运行相关的 pod 命令,清理你的项目等等。

这样做可以让我的代码存档并在没有调试时错误的情况下运行

【讨论】:

  • 我也是这么想的,但是当我从项目文件夹中删除库时,虽然项目构建良好,但在调试时出现Native module cannot be null 错误。你也遇到过这个吗?
  • 我现在被困在这个问题上,目前有 400 多个重复符号......我无法归档我的项目,我需要在本周末发布我使用混合库和豆荚,我不确定它是否引起了我所说的重叠库。我跑了pod deintegrate &amp;&amp; pod installduplicate symbol _OBJC_METACLASS_$_RCTWebSocketModule
【解决方案3】:

我通过以下方式解决了这个问题: (参考:https://github.com/react-community/react-native-maps/issues/718

  1. 打开 Xcode > Pods > Targets Support Files > Pods-{TARGET-NAME} 找到 “OTHER_LDFLAGS”和删除-ObjC在这两个文件中:

Pods-{TARGET-NAME}.release.xcconfige Pods-{TARGET-NAME}.debug.xcconfig

  1. 转到项目主要目标 > 构建 设置 > 其他链接器标志:确保没有 -ObjC 留在 值我删除了 ios 中的 build/Build 文件夹并再次运行您的项目。

现在可以了。

上述链接的副作用:应用程序可能会变大,因为其中可能存在重复的符号。

希望对你有帮助。

【讨论】:

  • 我必须在构建后进行清理,然后才能成功存档。谢谢
  • 您能多解释一下您的架构吗?您正在使用哪个库(除了 React)?你是如何通过 cocoapods (Podfile) 安装这些库的?
猜你喜欢
  • 2020-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 2017-01-23
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多