React Native XCode项目产品存档因架构arm64的重复符号而失败

Kai*_*ang 28 xcode ios cocoapods react-native

XCode日志

奇怪的是,我似乎无法让Archive在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
Run Code Online (Sandbox Code Playgroud)

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

真的很感激任何帮助或洞察力,坚持这几个小时.

stu*_*net 54

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

在此输入图像描述

在xCode中删除目标的问题是,它实际上编辑了Pods文件夹中不在版本控制中的project.pbxproj文件.因此,一旦您执行此操作,构建将存档,如果您从手动删除它的计算机以外的任何位置进行部署,它仍将失败.所以解决方案是将此post install命令添加到podfile的底部:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.name == "React"
      target.remove_from_project
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这只是循环遍历要安装的所有pod,并删除React的目标.这种方式构建项目的任何地方也将删除目标.现在,当您构建归档时,它不会失败.

  • 我把你的建议代码放在podfile的最底层,但我运行"archive"它仍然会给出同样的错误,我应该运行pod install吗? (5认同)

Kai*_*ang 16

另一个反应本地项目寻找一个相关的问题后,终于解决了这个问题在这里.

答案是Xcode项目中有两个React Native副本,一个来自CocoaPods,另一个来自子项目.只需删除已Libraries在Xcode内部的Podfile中声明的所有模块,并在清理并重新尝试后错误消失.

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

[2017年5月2日更新]

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

另一种方法是,以去除在两者存在那些重复的模块LibrariesPodfile 从所述 Podfile声明的代替Libraries文件夹.当然,运行相关的pod命令,清理项目等.

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

  • 这也是我的想法,但是当我从项目文件夹中删除库时,项目构建正常,在调试时我有一个`Native模块不能为null`错误.你也遇到过这个吗? (3认同)