Как создать 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 для управления версиями и обновления кода в соответствии с вашими предпочтениями. Я сам использую аналогичный подход и вполне доволен результатами.