обработка зависимостей для проекта iOS Framework

Я создал проект iOS Framework, используя этот метод: https://github.com/jverkoey/iOS-Framework

Работает довольно аккуратно, но я немного запутался в том, как включать библиотеки / фреймворки, которые необходимы моей структуре для работы, и, в частности, как это сделать, чтобы в случае, если стороннее клиентское приложение, использующее мою инфраструктуру, может включать эти библиотеки а также без конфликтов.

Скажем, мой код инфраструктуры нуждается в следующих двух вещах:

  • FacebookSDK.framework
  • libFlurry.a

Первый – это iOS Framework. Когда я добавлю его в фазу «Link Binary With Libraries» в моей платформе и попробую скомпилировать проект клиента, который использует мою фреймворк, компоновщик жалуется на недостающие символы – мне нужно добавить FacebookSDK к проекту клиента, который велик: нет возможности конфликты, если клиентские приложения хотят использовать Facebook.

Однако, когда я делаю то же самое со статической библиотекой Flurry, я получаю ошибку с повторяющимися символами при компиляции клиентского проекта. Что меня немного смущает, потому что это не FacebookSDK.framework, а только статическая библиотека?

ukaszs-iMac:FacebookSDK.framework lukasz$ file Versions/A/FacebookSDK Versions/A/FacebookSDK: Mach-O universal binary with 3 architectures Versions/A/FacebookSDK (for architecture i386): current ar archive random library Versions/A/FacebookSDK (for architecture armv7): current ar archive random library Versions/A/FacebookSDK (for architecture cputype (12) cpusubtype (11)): current ar archive random library 

Поэтому мои вопросы:

  1. почему библиотека, встроенная в фреймворк (например, Facebook), не связана с моим проектом проекта Framework, тогда как библиотека, включенная в качестве файла .a?
  2. как включить файл .a в мою структуру, чтобы он не вызывал ошибки повторяющихся символов, когда клиентское приложение, использующее мою фреймворк, также нуждается в этой конкретной статической библиотеке?

  • Доля коко-каподов с пользовательскими рамками, включенными в проект
  • В чем разница между встроенными бинарниками и связанными структурами
  • Swift Framework не включает символы из расширений в общие структуры
  • iOS - обновить структуру
  • Как использовать ManagedObjectModel Core Data внутри фреймворка?
  • В Xcode 7 как я могу установить статическую цель lib и целевую среду фрейма с тем же именем?
  • Абсолютный адрес пути Xcode 5 Framework / Library
  • Что такое Private API и почему Apple отвергает приложение iOS, если оно используется?
  • 6 Solutions collect form web for “обработка зависимостей для проекта iOS Framework”

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

    Если вы решите, что эти зависимости зависят от приложения, вы должны удалить их из «Link Binary With Libraries» и любой другой явной компоновки ссылок и просто проецировать свой проект фреймворка с помощью пути к этим фреймворкам и библиотекам, чтобы он мог найти символы (но не ссылки на них) во время компиляции (т.е. путь к библиотекам должен быть включен LIBRARY_SEARCH_PATHS).

    1. Используйте cocoapods, это легко ( http://cocoapods.org/ )

    2. Разработчики приложений должны будут включить podfile и загрузить зависимости.

    3. При разработке вашего SDK используйте примерное приложение / демонстрационное приложение поверх SDK для имитации этого.

    Вы не должны связывать что-либо при создании фреймворка, а просто создавать двоичный файл *.a с объектами вашей инфраструктуры.

    Кроме того, вы не должны включать код из других библиотек в свою структуру, поскольку клиентские приложения могут добавлять одни и те же библиотеки напрямую или использовать разные версии, тем самым создавая конфликты.

    Вы можете ссылаться на *.h файлы заголовков из других библиотек в своей структуре, чтобы скомпилировать ваши объекты.

    В результате шаги установки для вашей структуры должны содержать информацию о других необходимых инфраструктурах / библиотеках, их поддерживаемых версиях, о том, как добавлять файлы ресурсов (если есть) и т. Д. Только некоторые из многих причин, почему вы можете рассмотреть возможность создания CocoaPods , podspec вместо этого.

    Используйте менеджер зависимостей CocoaPods. Вот хороший гид,

    7 миниатюрных видеоуроков

    Вы должны использовать CocoaPods. Ваша зависимость от Facebook может быть сделана путем ссылки на CocoaPod.

    Если вы хотите включить эту конкретную версию Facebook в свой блок, вы можете поместить ее в свое репо и использовать свойство vendored_frameworks для ссылки на нее.

    Аналогично, если вы хотели бы использовать libFlurry.a, вы могли бы сделать это, используя s.vendored_libraries .

    Для системных библиотек вам не нужно их libZ.a , например libZ.a

    Я настоятельно рекомендую создать ваш CocoaPod, используя pod lib create YourPodName . Недавно они изменили механизм, как это работает, и это действительно приятно.

    Вы можете создать пример проекта, который показывает, как использовать ваш код в контексте приложения.

    Затем, один из других опрятных вещей, о которых я только что узнал, кто-то может pod try YourPodName и он автоматически загрузит, интегрирует и запускает проект Xcode.

    CocoaPods стоит того.

    В основном, если вы устанавливаете сторонние фреймворки, которые вы можете установить с помощью cocoapods (что действительно приятно, я бы это сделал), или они предлагают вам загрузить фреймворк и включить его в свой проект. Если вы решите загрузить библиотеку и включить ее, в списке «Начало работы» обычно есть список фреймворков.

    Средства: предлагайте их установить с помощью cocoapods и загрузить свою библиотеку, но не включайте ничего другого, дайте им список, в котором они нуждаются.

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.