Подтвердить что ты не робот

Как включить AFNetworking в качестве основы для использования в приложении iOS и расширении через CocoaPods

NB: Это связано с этим вопросом о структуре проекта, но я решил использовать прецедент для улучшения абстрактной проблемы.

Проблема

Как включить в мое приложение iOS и сопроводительное расширение iOS ( или ) через CocoaPods?

Вопросы

  • Для использования в расширениях необходимо создать AFNetworking с помощью #define AF_APP_EXTENSIONS, значит ли это, мне нужны 2 версии AFNetworking? Один для расширения и один для приложения?

  • Как настроить Podfile, чтобы рамки были построены и скопированы в нужные места? Документация на use_frameworks! немного тонкая.

4b9b3361

Ответ 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