Xcode с iOS - создание библиотеки таким образом, чтобы ее можно было легко запускать в режиме отладки, распространять, повторять

20 jpswain [2012-11-07 10:13:00]

Это для Xcode 4.5.x iOS armv7 armv7s и sim и, в частности, о настройке установки/создания проекта Xcode:

У меня есть проект "А", который является приложением в магазине приложений. У меня есть проект "B" , который является библиотекой, которая будет использоваться в как зависимость, но также распространена в качестве сторонней библиотеки другим компаниям для использования в своих приложениях. (сторонние приложения других компаний представлены в этом случае как "Y" ).

Вот требования:

  • Должен иметь возможность запускать "А" в режиме отладки и, конечно же, отлаживать вложенный проект "В" одновременно, в том же сборке/сеансе.
  • От "A" я могу CMD + щелкнуть на подписи метода от "B" и перейти прямо в этот файл src, где я могу свободно редактировать, а затем перекомпилировать, как если бы он был из того же проекта.
  • Разработчик "X" в какой-либо другой компании должен иметь возможность легко перетащить нашу библиотеку "B" в свой проект "Y" , где "B" - это статическая библиотека с открытыми только необходимыми файлами заголовков. "Y" , конечно, вызывает методы из подмножества фактических заголовочных файлов "B" . Только файлы из этого подмножества должны быть включены в дистрибутив для Dev "X" .
  • Dev "X" не нужно ничего менять вообще в своем проекте Xcode, просто перетащите папку для "B" (которая содержит статические библиотеки и подмножество файлов заголовков) в свой проект и нажмите "Скопировать ресурсы, создать ссылки и т.д.".
  • Мне нужно легко создать статическую библиотечную сборку "B" на основе тех же файлов, которые я редактировал все это время, когда я повторяю и отлаживаю этот проект "B" внутри зависимого проекта "A" ,.
  • "B" не имеет ресурсов помимо исходного кода - нет объектов изображения, xibs или чего-либо подобного.
  • От "B" я нажимаю "Архив" и "Пуф"! там статическая lib (должна быть толстой двоичной, я имею в виду, что она работает на симуляторе + armv7 + armv7s, пожалуйста!) с необходимыми заголовками, готовыми к распространению.
  • Все это должно быть утверждение магазина приложений -дружественное
  • Также это должно быть надежным. Это нехорошо, если я должен продолжать возвращаться, чтобы внести изменения в конфигурацию каждый раз, когда добавляю один файл.

UPDATE:
* САМЫЙ ВАЖНЫЙ : Это должно быть репо, я могу проверить, что это полный сквозной шаблон того, что я ищу, и мне нужно иметь возможность открывать Xcode 4.5.2+ и нажмите кнопку воспроизведения и посмотрите, как это происходит, безболезненно.

500 баллов всем, кто может предоставить мне шаблонный проект, который демонстрирует все, что я описал выше, "A" , "B" и "Y" (с помощью статического lib "B" , используемого как a). Все, что мне нужно, это набор скелетных проектов ( "A" , "B" (вложенных внутри "A" ) и "Y" ), который показывает, как это можно сделать. Пожалуйста, не откладывайте ответ до тех пор, пока не будет отправлена ​​награда. Если это соответствует моим требованиям, я обязательно удостоверится, что вы получите мои очки бонусов.

Я немного обеспокоен тем, что с ограничениями Xcode это не возможно даже так, что это не полная проблема. Пожалуйста, докажите, что я ошибаюсь.

ОБНОВЛЕНИЕ: Я решил, что меня больше не интересует armv6. До свидания, armv6. Дополнительный кредит, если вы можете получить armv6, свернутый в выходной файл dist вместе с armv7, armv7s, i386/simulator.

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

ios xcode4 xcode4.5 xcodebuild


3 ответа


6 Решение Dunkelstern [2012-11-08 17:01:00]

Это невозможно в Xcode. Вам понадобятся некоторые скрипты сборки (которые вы можете вызывать из Xcode, конечно) из-за целевого коммутатора компиляции (симулятор, устройство и т.д.).

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

Я сделал что-то подобное для libturbojpeg, см. https://github.com/dunkelstern/libturbojpeg-ios для справки. В настоящее время он помещает жирную библиотеку в "lib", если вы вызываете файл "build.sh" с терминала, но пропускаете заголовки распространения. В случае с libturbojpeg мне понадобилось 2 файла проекта, потому что каждая цель компилирует в библиотеку другой подмножество файлов ассемблера (лучше не смотрите на материал сборщика ассемблера). Для компиляции вам понадобится последняя версия NASM, поскольку корабли версии Apple являются древними (получите ее с помощью brew). Я скоро отправлю шаблон для такого проекта построения библиотеки на той же учетной записи. (Редактирует или комментирует, если это делается здесь с соответствующими ссылками)

В основном он работает следующим образом:

  • Создайте конструкцию script, которая вызывает xcodebuild для каждой целевой платформы.
  • Проект библиотеки Xcode должен содержать script, чтобы удалить встроенные библиотеки в каталог, который может построить script
  • Дополнительные заголовки должны быть скопированы с помощью целевого действия "Копировать файлы"
  • Строка script должна объединить все сборки библиотек с lipo
  • Добавьте сборку script в качестве цели "Запуск Script" в вашу сборку, но будьте уверены, что вы не создаете бесконечный цикл (или просто вызываете его из терминала для создания сборки выпуска).
  • В вашем основном проекте добавьте подпроект библиотеки

Затем вы можете распространять выходной каталог с скопированными файлами заголовков и объединенной универсальной библиотекой lipo и обычно использовать библиотеку как подпроект в своей рабочей области, как обычно, (он строит и связывает только необходимые библиотеки, а не универсальный lib, но это не должно быть проблемой)

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

Ссылка на пример проекта: https://github.com/dunkelstern/StaticLibraryTemplate


3 djromero [2012-11-15 20:36:00]

Я использую https://github.com/jverkoey/iOS-Framework, чтобы достичь чего-то очень похожего на ваши потребности. Дайте ему все заслуги, я просто подытоживаю, как я это делаю.

Создайте статическую библиотеку, как обычно, плюс эти настройки:

  • Добавить копию файлов для копирования заголовков. Я не использую надлежащую фазу "Копирование заголовков", потому что я читал где-то, что не рекомендуется для статических библиотек iOS.
    • Назначение: Каталог продуктов
    • Subpath: ${PROJECT_NAME}/Headers
  • Измените несколько настроек:
    • "Снятие мертвого кода" = > Нет (для всех настроек)
    • "Отладка отладочных символов во время копирования" = > Нет (для всех настроек)
    • "Стиль полосы" = > Неглобальные символы (для всех настроек)
  • Добавьте прогон script, чтобы подготовить структуру к библиотеке:
    • Используйте script prepare_framework.sh.

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

Подготовленная структура будет использоваться для распространения двоичной версии:

В том же статичном проекте библиотеки добавьте цель "Совокупность":

  • Добавить статическую библиотеку в качестве зависимости.
  • Добавьте фазу script для создания недостающих архитектур. Используйте script build_framework.sh.

script угадайте, что такое другая платформа и используйте xcodebuild для ее компиляции. Затем используйте lipo для создания живого двоичного кода со всеми архитектурами. Назначением жирной статической библиотеки будет дерево структуры, которое мы создали ранее. Окончательная структура копируется в папку продуктов в папке сборки.

При таком подходе вы можете:

  • Создайте и отлаживайте ваше приложение со статической библиотекой в ​​качестве вложенного проекта.
  • Создайте дистрибутивную версию библиотеки в на один шаг с заголовками, встроенными в пакетный пакет. Встроенная структура находится в каталоге продуктов проекта.
  • Используйте функцию Xcode Archive. По какой-то причине окончательные файлы не копируются в расположение архива. Вы можете использовать его для создания разделенной версии фреймворка.

Не стесняйтесь клонировать проект, используя этот метод для упаковки библиотеки: json-framework fork. Я немного изменил скрипты, проверьте свою вилку iOS-framework.

Что касается armv6, я думаю, вам нужно и старый IOS SDK 4.3 и добавить вручную литерал armv6 в список допустимых архитектур и фактических архитектур. У меня нет и старого SDK, чтобы проверить его прямо сейчас.


2 combinatorial [2012-11-22 04:01:00]

Cocoapods покрывает ваши потребности. Хотя стандартный способ использовать его - отправить спецификации pod на центральный репозиторий git. Он поддерживает добавление альтернативных репозиториев для распространения или вручную их создание, см. здесь. Преимущества использования cocoapods состоят в том, что он отвечает всем вашим требованиям и что он становится стандартным способом распространения библиотек (например, используемых такими компаниями, как facebook и stackmob) и с открытым исходным кодом (например, afnetworking). Итак, если вы теперь зависите от сторонних библиотек или в будущем, возможно, что cocoapods помогут вам справиться с этой зависимостью.