React Native XCode Project Product Archive Fails with duplicate symbols for architecture arm64

15,957

Solution 1

Finally solved the problem after finding a relevant issue on another react-native project here.

The answer is that there is two copies of React Native in the Xcode project, one from CocoaPods and another as a subproject. Just remove all modules that were already declared in Podfile under the Libraries inside Xcode and the error goes away after a clean and re-try.

What's interesting about this issue is that all builds in Debug and Release works but it fails when attempting to Archive the project for distribution.

[Update 2 May 2017]

The solution I described above can cause debug-time errors when you run your code with react-native run-ios/android though it allows the project to be successfully archived.

An alternative method is to remove those duplicate modules that exist both in Libraries and Podfile from the Podfile declaration instead of the Libraries folder. And of course run the relevant pod commands, clean your project etc.

Doing this allowed my code to archive and also run without debug-time errors

Solution 2

So I did even more research into this and the workaround is actually much simpler. Or at least it was in my case. The problem is that when you declare React in the podfile, the Pods xcodeproject gets a React target as part of the pod install process. Having this target in the Pods project is what causes the error when you Archive. So the fix is to remove the target.

enter image description here

The problem with removing the target in xCode is that this actually edits project.pbxproj file within the Pods folder which is not in version control. So while the build will archive once you do this, if you deploy from anywhere other than the machine that manually removed it, it will still fail. So the solution is to add this post install command to the bottom of your podfile:

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

This simply loops through all the pods to be installed and removes the target for the React one. This way anywhere that builds the project, will also remove the target. Now when you build to Archive it will not fail.

Solution 3

I solved this issue by the following: (ref.: https://github.com/react-community/react-native-maps/issues/718)

  1. Open Xcode > Pods > Targets Support Files > Pods-{TARGET-NAME} find "OTHER_LDFLAGS" and remove only -ObjC in these two files:

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

  1. Go to project main target > Build Settings > Other Linker Flags: Make sure no -ObjC is left in the value I deleted the build/Build folder in ios and run your project again.

It works now.

Side effects from the link above: the app may become larger as there may be duplicated symbols in it.

Hope it can help you.

Share:
15,957
Kaiwen Huang
Author by

Kaiwen Huang

Updated on June 07, 2022

Comments

  • Kaiwen Huang
    Kaiwen Huang almost 2 years

    XCode Log

    Strangely, I can't seem to get Archive to work in XCode but the build succeeds without the errors on duplicate symbols if I do not attempt to Archive but simply build a release version. The project builds properly on devices as well.

    I have searched up on this topic and tried disabling testability, and setting the 'No Common Blocks' in the project settings to NO as well but no luck so far.

    The Project is a React Native 0.40 based project with CocoaPods installed as well. PodFile is this

    # 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 Version is 8.2.1, and the project file is opened via .xcworkspace since pods are installed.

    Would really appreciate any help or insight on this, been stuck at this for hours.