Как создать iOS-фреймворк со слабосвязанными библиотеками CocoaPods

Я пытаюсь создать iOS Framework (Test.framework), используя новый шаблон, предложенный Xcode 6 для создания сенсорных рамок Cocoa. Фреймворк имеет разные зависимости (как AFNetworking или FacebookSDK), указанные в Podfile. Я не хочу, чтобы зависимости были включены в структуру, я просто хочу ссылаться на них.

Проблема в том, что когда я собираю фреймворк, libPods.a связывается и включается.Q: Как я могу ссылаться на библиотеку libPods.a, но не включать ее в каркас?


Больше деталей:

Я читал о слабых ссылках: https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/WeakLinking.html Но у меня нет большого опыта работы с настройками проекта, поэтому я ' я не профи.

Я пытался поместить libPods.a как "Необязательный", но ничего не изменилось, зависимости все еще были включены.

Я попытался удалить libPods.a из раздела "Связать двоичные файлы с библиотеками" на этапах сборки, но я получаю эту ошибку (после очистки папки проекта и повторной сборки):

ld: library not found for -lPods-MyFramework-AFNetworking

Я попытался удалить все флаги из "Другие флаги компоновщика", но он дает мне неопределенные символы:

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_FBSession", referenced from:
      objc-class-ref in TestClass.o
ld: symbol(s) not found for architecture armv7

Вот исходный код для чистого проекта с включенными библиотеками: https://www.dropbox.com/sh/0ymuzw6kiagz02j/AABzyHiZVaQQvBEnjBgRBq3ua?dl=0

1 ответ

Приведенный ниже код post_install находится внизу вашего подфайла. Это позволяет вам указать, какие цели вы хотите, и структуры, которые будут слабо связаны. Мы можем использовать это для слабого связывания фреймворка внутри нашей динамической цели фреймворка, но по-прежнему будем связывать его корректно при компиляции нашего основного приложения.

targets_to_weaklink=['Target1']
frameworks_to_weaklink=['Framework1']
post_install do |installer|
  targets_to_weaklink.map!{|t| t="Pods-#{t}"}
  installer.pods_project.targets.each do |target|
    next unless targets_to_weaklink.include?(target.name)

    target.build_configurations.each do |config|
      base_config_reference = config.base_configuration_reference
      unless base_config_reference.nil?
        xcconfig_path = base_config_reference.real_path
        xcconfig = File.read(xcconfig_path)
        frameworks_to_weaklink.each do |framework|
          xcconfig = xcconfig.gsub(/-framework "#{framework}"/, "-weak_framework \"#{framework}\"")
        end
        File.open(xcconfig_path, "w") { |file| file << xcconfig }
      end
    end
  end
end

Я пока не могу комментировать, поэтому отвечу здесь. Я думаю, что вы не можете сделать это. Cocoapods создают статическую библиотеку, а не динамическую, поэтому весь код должен быть там, когда вы компилируете, и встроен в вашу среду.

Документация Cocoapods, перейдите к "Что происходит за кулисами?" для подробного объяснения

Если вы хотите собрать некоторую базовую конфигурацию для некоторых из ваших обычных стручков, вероятно, лучший способ сделать это - создать собственный Cocoapod с другими в качестве зависимостей. Таким образом, вы можете полагаться на cocoapods для управления версиями и обновления кода в соответствии с вашими предпочтениями. Я сам использую аналогичный подход и вполне доволен результатами.

Другие вопросы по тегам