CocoaPods — Дублирующие символы, когда приложение и фреймворк совместно используют зависимость

#ios #swift #cocoapods #crashlytics

#iOS #swift #cocoapods #crashlytics

Вопрос:

Я пишу приложение для iOS, используя CocoaPods 1.6.0 в качестве менеджера зависимостей. Мой проект состоит из проекта приложения iOS ( myapp-ui ), а также 3 проектов iOS framework ( myapp-common , myapp-model и myapp-editor ). Я также использую Fabric.io отчеты о сбоях и показатели приложений. В моих myapp-ui и myapp-model проектах используются Fabric и Crashlytics фреймворки. Мой Pods файл выглядит следующим образом:

 platform :ios, '11.0'
workspace 'MyApp.xcworkspace'

project 'myapp-ui/myapp-ui.xcodeproj'
project 'myapp-common/myapp-common.xcodeproj'
project 'myapp-model/myapp-model.xcodeproj'
project 'myapp-editor/myapp-editor.xcodeproj'

target 'myapp-ui' do
  use_frameworks!

  project 'myapp-ui/myapp-ui.xcodeproj'

  # Pods for myapp-ui
  pod 'SwiftyBeaver'
  pod 'SwifterSwift'
  pod 'Fabric'
  pod 'Crashlytics'
  pod 'KeychainSwift', '~> 13.0'

  target 'myapp-uiTests' do
    inherit! :search_paths
    # Pods for testing
  end

end

target 'myapp-common' do
  use_frameworks!

  project 'myapp-common/myapp-common.xcodeproj'

  # Pods for myapp-common
  pod 'SwiftyBeaver'
  pod 'SwifterSwift'
  pod 'KeychainSwift', '~> 13.0'

end

target 'myapp-model' do
  use_frameworks!

  project 'myapp-model/myapp-model.xcodeproj'

  # Pods for myapp-model
  pod 'SwiftyBeaver'
  pod 'SwifterSwift'
  pod 'Fabric'
  pod 'Crashlytics'

end

target 'myapp-editor' do
  use_frameworks!

  project 'myapp-editor/myapp-editor.xcodeproj'

  # Pods for myapp-editor

end
  

Модули устанавливаются просто отлично, и мое приложение создается без проблем. Однако, когда я запускаю его, я вижу большое количество ошибок в консоли, которые выглядят примерно так:

 objc[62607]: Class CLSInternalReport is implemented in both <SOME LOCATION>/Build/Products/Debug-iphonesimulator/myapp_model.framework/myapp_model (0x11252f960) and <SOME OTHER LOCATION>/myapp-ui.app/myapp-ui (0x10f2831e8). One of the two will be used. Which one is undefined.
objc[62607]: Class Crashlytics is implemented in both <SOME LOCATION>/Products/Debug-iphonesimulator/myapp_model.framework/myapp_model (0x11252f9b0) and <SOME OTHER LOCATION>/myapp-ui.app/myapp-ui (0x10f283238). One of the two will be used. Which one is undefined.
objc[62607]: Class CLSFileManager is implemented in both <SOME LOCATION>/Build/Products/Debug-iphonesimulator/myapp_model.framework/myapp_model (0x11252fa00) and <SOME OTHER LOCATION>/myapp-ui.app/myapp-ui (0x10f283288). One of the two will be used. Which one is undefined.
objc[62607]: Class CLSAlert is implemented in both <SOME LOCATION>/Build/Products/Debug-iphonesimulator/myapp_model.framework/myapp_model (0x11252fa78) and <SOME OTHER LOCATION>/myapp-ui.app/myapp-ui (0x10f283300). One of the two will be used. Which one is undefined.
  

Есть ли способ устранить эти предупреждения? Я попытался удалить их из myapp-ui мышления, которое myapp-ui использует myapp-model (и, следовательно, унаследует зависимость), но это не сработало. Я в недоумении относительно того, как это решить. Мысли?

Ответ №1:

Я получал те же предупреждения, которые вы видите, и мне потребовалось некоторое время, чтобы найти исправление. Оказывается, это происходит, когда у вас есть зависимость, которая поставляется предварительно скомпилированной, например, Fabric и Crashlytics . Я думаю, это потому, что они копируются дважды.

Что я сделал, так это добавил эти модули только к целевому приложению. Мой Podfile в конечном итоге выглядел примерно так

 def pods
    pod 'CGMath'
    ...
end

def app
    pod 'Crashlytics'
    pod 'Fabric'
end

target 'FrameworkTarget' do
    pods
end

target 'AppTarget' do
    pods
    app
end
  

Комментарии:

1. Если я это сделаю, то получу ошибки компиляции «Нет такого модуля» в моем проекте myapp-model, поскольку он вызывает Crashlytics.

2. Ах, я забыл, что перенес весь код Crashlytics в AppDelegate, который находится снаружи FrameworkTarget . Если вы не можете этого сделать, вам, возможно, придется смириться с этими предупреждениями.