Как включить AFNetworking в качестве основы для использования в приложении iOS и расширении через CocoaPods
NB: Это связано с этим вопросом о структуре проекта, но я решил использовать прецедент для улучшения абстрактной проблемы.
Проблема
Как включить afnetworking в мое приложение iOS и сопроводительное расширение iOS (ios8-extention ios8-today-widget или ios8-share-extension) через CocoaPods?
Вопросы
-
Для использования в расширениях необходимо создать AFNetworking с помощью #define AF_APP_EXTENSIONS
, значит ли это, мне нужны 2 версии AFNetworking? Один для расширения и один для приложения?
-
Как настроить Podfile, чтобы рамки были построены и скопированы в нужные места? Документация на use_frameworks!
немного тонкая.
Ответы
Ответ 1
Update:
Как отметил Ритмичный Фистман, первоначальный метод ответа перезаписывается при выполнении новой установки pod.
Aelam предоставил следующий метод в этом Github issue:
Добавьте это в свой файл. не забудьте заменить целевое имя
post_install do |installer_representation|
installer_representation.project.targets.each do |target|
if target.name == "Pods-YOU_EXTENSION_TARGET-AFNetworking"
target.build_configurations.each do |config|
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'AF_APP_EXTENSIONS=1']
end
end
end
end
Устаревший ответ:
1) Убедитесь, что pod 'AFNetworking'
включен для обеих целей (ваше приложение-контейнер и расширение) в вашем подкоде.
Пример в моем случае:
target 'ContainerAppTarget', :exclusive => true do
pod "SDKThatInternallyUsesAFNetworking"
end
target 'ExtensionTarget', :exclusive => true do
pod 'AFNetworking'
end
2) В XCode нажмите на Pods в представлении иерархии, чтобы привести его варианты сборки. Затем в вариантах построения выберите цель, для которой вы смотрите параметры сборки в раскрывающемся списке. Там выберите Pods-{Extension Target Name}-AFNetworking
(он должен был быть создан автоматически с помощью pod install, затем выберите "Build Settings". Затем в Apple LLVM 6.0 - Language убедитесь, что заголовок Prefix имеет имя файла. Это имя файла в моем случае было Target Support Files/Pods-{Extension Target Name}-AFNetworking/Pods-{Extension Target Name}-AFNetworking-prefix.pch
. 't иметь такое имя файла или подобное, а затем добавить его.
3) Перейдите к этому заголовочному файлу префикса, который был указан там или вы добавили его. Он будет почти пустым, затем добавьте следующую строку в конец:
#define AF_APP_EXTENSIONS
Это должно позволить вашему контейнерному приложению указывать на версию встроенной сети AFNetworking, а ваше добавочное приложение - на другое, построенное с установленным флагом. Так что только одна версия библиотеки, но построена двумя разными способами, каждая по одной из целей.
Ответ 2
Для новичков в этом посте все немного изменилось.
Я провел немало времени, ударяя головой о стену, надеюсь, это избавит некоторых из вас от той же участи.
Cocoapods изменились так, что теперь он генерирует только одну библиотеку для каждого модуля, поэтому для правильной установки макроса AF_APP_EXTENSIONS
он действительно должен быть установлен в целевом объекте AFNetworking, а не в вашей цели расширения.
Например (с некоторыми довольно заявлениями журнала):
post_install do |installer_representation|
installer_representation.pods_project.targets.each do |target|
puts "=== #{target.name}"
if target.name == "AFNetworking"
puts "Setting AFNetworking Macro AF_APP_EXTENSIONS so that it doesn't use UIApplication in extension."
target.build_configurations.each do |config|
puts "Setting AF_APP_EXTENSIONS macro in config: #{config}"
config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)', 'AF_APP_EXTENSIONS=1']
end
end
end
end
Также стоит отметить pods_project
in installer_representation.pods_project.targets.each do |target|
Cocoapods устарел project
и был изменен на pods_project
Единственным недостатком этого является то, что AFNetworking не будет использовать любые API-интерфейсы UIApplication в контейнере, но это не было проблемой в моем проекте.
Надеюсь, что это поможет.
Ответ 3
Обновление вашего модуля до версии 2.6 может решить эту проблему. См. Таблицу требований по адресу: https://github.com/AFNetworking/AFNetworking