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

Создание распределяемой статической библиотеки, использующей кокоаподы

Я создаю статическую библиотеку, которая будет распространена среди других разработчиков iOS и возникла проблема с настройкой компоновщика, чтобы позволить статической библиотеке использоваться в другом приложении. Я использовал это руководство, чтобы создать набор MyStaticLibrary.framework, содержащий сам lib, и другие активы, такие как изображения. Это успешно работает и использует cocoapods для источника необходимых зависимостей (AFNetworking и т.д.). Пока что так хорошо.

Но когда я импортирую MyStaticLibrary.framework в новый проект Xcode для тестирования сборки приложения с помощью библиотеки, я получаю массу ошибок компоновщика (Undefined символы для архитектуры i386, _OBJC_CLASS _ $_ CLASSNAME), указывающие, что я что-то делаю здесь очень плохо.

Итак, мой вопрос в том, как я могу создать MyStaticLibrary.framework с зависимостями, полученными из cocoapods, чтобы я мог предоставить третьему лицу только мой файл фреймворка и разрешить им доступ ко всем функциям, указанным в публичных заголовках?

4b9b3361

Ответ 1

Любые библиотеки, которые вы используете с помощью CocoaPods, будут не компилироваться в вашу инфраструктуру по умолчанию - они предназначены для внешних зависимостей, которые не являются частью вашего реального продукта. Однако, согласно их часто задаваемым вопросам, они поддерживают режим, в котором вы можете загружать модули и не связывать их с вашим проектом. Из их FAQ:

Обратите внимание, что сам CocoaPods не требует использования рабочего пространства. Если вы предпочитаете использовать подпроекты, вы можете сделать это, запустив pod install --no-integrate, что позволит вам интегрироваться в ваш проект, как вам удобно.

Чтобы включить внешние зависимости в скомпилированный двоичный файл:

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

  • Для статических библиотек (т.е. .a файлов) в фазе сборки Link Binary With Libraries необходимо включить все те, которые вы хотите скомпилировать. Вы также должны убедиться, что связанные файлы заголовков включены в фазу сборки Copy Headers с соответствующей видимостью.

Примечание При объединении сторонних библиотек таким образом вы рискуете столкнуться с конфликтами с проектами, которые интегрируют вашу инфраструктуру. Например, скажем, вы используете lib под названием SOSomeView, и вы решили скомпилировать это с помощью своей фреймворка. Теперь, если приложение, в которое вы интегрируетесь, также включает SOSomeView, вы получите ошибку времени компиляции, которую класс объявит дважды. Чтобы исправить эту проблему, вы должны переименовать любые внешние зависимости, которые вы хотите жестко указать в свою структуру (например, переименуйте класс в XXSOSomeView).

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