web-dev-qa-db-ja.com

ReactネイティブXCodeプロジェクト製品アーカイブは、アーキテクチャarm64の重複シンボルで失敗します

XCode Log

奇妙なことに、XCodeでArchiveを動作させることはできませんが、Archiveを試行せずにリリースバージョンをビルドするだけで、重複シンボルのエラーなしでビルドが成功します。プロジェクトもデバイス上で適切にビルドされます。

私はこのトピックを検索し、テスト可能性を無効にして、プロジェクト設定の「No Common Blocks」をNOに設定しましたが、これまでのところ運はありません。

プロジェクトはReact CocoaPodsがインストールされたネイティブ0.40ベースのプロジェクトです。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を介して開かれます。

これに関する助けや洞察を本当に感謝します、何時間もこれで立ち往生しています。

26
Kaiwen Huang

最後に、別の反応ネイティブプロジェクトで関連する問題を見つけた後、問題を解決しました here

答えは、Xcodeプロジェクトには2つのコピーReact Native、CocoaPodsからのコピーとサブプロジェクトとしてのコピーがあります。PodfileでLibraries Xcode内で、エラーを消去して再試行すると消えます。

この問題の興味深い点は、デバッグとリリースのすべてのビルドは機能するが、配布のためにプロジェクトをアーカイブしようとすると失敗することです。

[2017年5月2日更新]

上記のソリューションは、react-native run-ios/Androidを使用してコードを実行すると、デバッグ時エラーを引き起こす可能性がありますが、プロジェクトを正常にアーカイブできます。

別の方法は、LibrariesPodfileの両方に存在する重複モジュールをPodfile宣言から削除することですLibrariesフォルダーの代わりに。そしてもちろん、関連するポッドコマンドを実行し、プロジェクトをクリーンアップします。

これにより、コードをアーカイブし、デバッグ時エラーなしで実行できます

16
Kaiwen Huang

そのため、私はこれについてさらに調査し、回避策は実際にははるかに簡単です。または、少なくとも私の場合はそうでした。問題は、ポッドファイルでReactを宣言すると、Pods xcodeprojectがReactターゲットをpod installプロセスの一部として取得することです。このターゲットをPodsプロジェクトに含めると、アーカイブ時にエラーが発生します。そのため、修正はターゲットを削除することです。

enter image description here

XCodeでターゲットを削除する際の問題は、バージョン管理下にないPodsフォルダー内のproject.pbxprojファイルを実際に編集することです。そのため、これを実行するとビルドはアーカイブされますが、手動で削除したマシン以外の場所からデプロイすると、ビルドは失敗します。そのため、解決策は、このインストール後コマンドをポッドファイルの下部に追加することです。

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

これにより、インストールするすべてのポッドがループされ、Reactのターゲットが削除されます。この方法でプロジェクトをビルドすると、ターゲットも削除されます。これで、Archiveにビルドしても失敗しません。

52
stueynet

この問題を次の方法で解決しました:(参照: https://github.com/react-community/react-native-maps/issues/718

  1. Xcode> Pods> Targets Support Files> Pods-{TARGET-NAME}を開き、 "OTHER_LDFLAGS"およびremoveのみでこれら2つの-ObjCを見つけます。ファイル:

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

  1. project main target> Build Settings> Other Linker Flagsに移動します:iosでbuild/Buildフォルダーを削除した値に-ObjCが残っていないことを確認し、再びプロジェクト。

今は動作します。

上記のリンクの副作用:重複するシンボルがあるため、アプリが大きくなる場合があります。

それがあなたを助けることを願っています。

1
Alexandre Lage