

現在、Embedded Framework で複数ターゲットに分割して開発しているのですが、  
CocoaPodsでFirebaseを複数ターゲットにインストールすると起動後にクラッシュしてしまいます。

[code]

    objc[97307]: Class FIRMessagingLog is implemented in both /Users/yuto/Library/Developer/Xcode/DerivedData/App-bgkajtjdcnvxnxexzeaimkikirwu/Build/Products/Release-iphonesimulator/App.framework/App (0x10393ad98) and /Users/yuto/Library/Developer/CoreSimulator/Devices/871E1A28-1266-4B31-BF14-A84577AA550D/data/Containers/Bundle/Application/81283C37-9D64-425F-A316-9303BD252618/App.app/App (0x1020f43b0). One of the two will be used. Which one is undefined.
    objc[97307]: Class VCWeakObjectHolder is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AVConference.framework/Frameworks/ViceroyTrace.framework/ViceroyTrace (0x12556c4d0) and /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AVConference.framework/AVConference (0x1246bae38). One of the two will be used. Which one is undefined.
    2018-06-28 10:58:37.719414+0900 App[97307:3379853] 5.3.0 - [Firebase/Core][I-COR000005] No app has been configured yet.
    
[/code]

Podfileは以下のようにしています。

[code]

    abstract_target 'Top' do
      # Uncomment the next line to define a global platform for your project
      platform :ios, '10.0'
    
      pod 'Firebase/Core'
      pod 'Firebase/Auth'
    
      target 'App' do
        # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
        use_frameworks!
    
        # Pods for App
    
        target 'AppTests' do
          inherit! :search_paths
          # Pods for testing
        end
    
      end
    
      target 'AppExtension' do
        # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
        use_frameworks!
    
        # Pods for AppExtension
    
      end
    
      target 'AppFlux' do
        # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
        use_frameworks!
    
        # Pods for AppFlux
    
      end
    
      target 'AppKit' do
        # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
        use_frameworks!
    
        # Pods for AppKit
    
      end
    
      target 'AppUI' do
        # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
        use_frameworks!
    
        # Pods for AppUI
    
      end
    end
    
[/code]

環境  
Xcode: 9.4.1  
CocoaPods: 5.0.1

下記を参考にしましたが、具体的な解決策が見つからず困っています  
\- <https://teratail.com/questions/87567>  
\- <https://github.com/firebase/quickstart-ios/issues/231>

ご回答いただけるととても嬉しく思います。  
よろしくお願いいたします。


CC BY-SA 4.0
2018-06-28T02:23:59.040
45111
2019-01-31T15:02:20.630
2018-06-28T08:02:34.693
25991
25991
question
swift ios xcode firebase cocoapods
CocoaPodsでFirebaseを複数ターゲットにインストールするとクラッシュする


FirebaseはFrameworkの体裁を取っていますが、実際はStatic
Libraryです。複数のフレームワークにリンクすると、複数のシンボルがリンクされてしまいます。  
また、CocoaPodsの現在の使用により、１つのターゲットにリンクしたとしても、すべてのターゲットにリンカフラグが設定されるので、結局は同じ問題が起こります。  
解決方法はいろいろありますが、基本的には１つのターゲットにリンクするようにして、他のターゲットからはそのフレームワークをImportする形で使用することです。  
で、具体的にCocoaPodsでどうしたらいいかというと、  
どれか１つのターゲットだけにリンクするようにPodfileを構成し、その上でさらに、

[code]

    platform :ios, '10.0'
    
    use_frameworks!
    
    pod 'SwiftGen'
    pod 'SwiftLint'
    pod 'LicensePlist'
    
    target 'XXXApp' do
      pod 'Shimmer', inhibit_warnings: true
    
      target 'XXXAppTests' do
        inherit! :search_paths
        pod 'Mockingjay', inhibit_warnings: true
        pod 'iOSSnapshotTestCase', inhibit_warnings: true
      end
    
      target 'XXXAppUITests' do
        inherit! :search_paths
      end
    end
    
    target 'Foo' do
      pod 'GoogleTagManager', inhibit_warnings: true
    
      target 'FooTests' do
        inherit! :search_paths
        pod 'Mockingjay', inhibit_warnings: true
      end
    end
    
    post_install do |installer|
        installer.aggregate_targets.each do |aggregate_target|
            puts aggregate_target.name
            if aggregate_target.name == 'Pods-XXXApp'
                aggregate_target.xcconfigs.each do |config_name, config_file|
                    config_file.libraries.delete('GoogleAnalytics')
    
                    config_file.frameworks.delete('FirebaseAnalytics')
                    config_file.frameworks.delete('FirebaseCore')
                    config_file.frameworks.delete('FirebaseCoreDiagnostics')
                    config_file.frameworks.delete('FirebaseInstanceID')
                    config_file.frameworks.delete('FirebaseNanoPB')
                    config_file.frameworks.delete('GoogleSymbolUtilities')
                    config_file.frameworks.delete('GoogleTagManager')
                    config_file.frameworks.delete('GoogleToolboxForMac')
                    config_file.frameworks.delete('GoogleUtilities')
                    config_file.frameworks.delete('nanopb')
    
                    xcconfig_path = aggregate_target.xcconfig_path(config_name)
                    config_file.save_as(xcconfig_path)
                end
            end
        end
    end
    
[/code]

^ 上記のように、リンクしないターゲットからはFirebaseに関連するライブラリのリンカフラグを取り除く、というのが最も分かりやすい解決法だと思います。  
この例だと、XXXAppとFooというターゲットがあって、FooはEmbeddedFrameworkです。FirebaseはFooにのみリンクしています。  
（GoogleTagManagerがFirebaseAnalyticsに依存しています。）  
しかし、CocoaPodsがXXXAppにもリンカフラグを設定してしまうので、XXXAppからFirebase関連のライブラリのリンカフラグを取り除いています。  
ターゲットが増えても理屈は同じです。


CC BY-SA 4.0
2018-06-28T12:49:38.880
45131
2018-06-28T12:49:38.880
5519
45111
answer