С Xcode 6 мы получаем возможность создавать собственные Dynamic Cocoa Frameworks
.
Из-за:
Симулятор все еще использует
32-bit
библиотеку-
начиная с 1 июня 2015 г. обновления приложений, представленные в App Store, должны включать поддержку 64-разрядных версий и быть построены с помощью iOS 8 SDK ( developer.apple.com )
Нам нужно сделать толстую библиотеку для запуска проекта на устройствах и симуляторах. т.е. поддерживает как 32, так и 64 бит в Frameworks.
Но я не нашел никаких руководств, как экспортировать универсальный Fat Framework для будущей интеграции с другими проектами (и поделиться этой библиотекой с кем-нибудь).
Вот мои шаги по воспроизведению:
Установить
ONLY_ACTIVE_ARCH=NO
вBuild Settings
Добавить поддержку
armv7 armv7s arm64 i386 x86_64
вArchitectures
(обязательно)
- Соберите Framework и откройте его в Finder:
- Добавить этот фреймворк в другой проект
Фактический результат:
Но в итоге у меня все еще проблема с запуском проекта с этим фреймворком сразу на устройствах и симуляторе.
если я возьму фреймворк из
Debug-iphoneos
папки - он работает на устройствах и выдает ошибку на симуляторах:ld: symbol(s) not found for architecture i386
xcrun lipo -info CoreActionSheetPicker
Архитектуры в толстом файле: CoreActionSheetPicker: armv7 armv7s arm64
если взять фреймворк из
Debug-iphonesimulator
папки - на симуляторах работает. и у меня ошибка на устройстве:ld: symbol(s) not found for architecture arm64
xcrun lipo -info CoreActionSheetPicker
Архитектуры в толстом файле: CoreActionSheetPicker: i386 x86_64
Итак, как создать динамический фреймворк, работающий на устройствах и симуляторах?
Этот ответ относится к Xcode 6 iOS, создавая какао Touch Framework - проблемы с архитектурой, но он не дублируется.
Обновить:
Я нашел "грязный прием" на этот случай. Смотрите мой ответ ниже . Если кто-то знает более удобный способ - дайте знать!
источник
Ответы:
Актуальность этого ответа: июль 2015 года. Скорее всего, что-то изменится.
TL; DR;
В настоящее время в Xcode нет инструментов для автоматического экспорта универсального фреймворка, поэтому разработчик должен прибегать к ручному использованию
lipo
инструмента. Также согласно этому радару перед отправкой в AppStore разработчик, который является потребителем фреймворка, также должен использоватьlipo
для удаления фрагментов симулятора из фреймворка.Далее следует более длинный ответ
Я провел аналогичное исследование в этой теме (ссылка внизу ответа).
Я не нашел каких - либо официальных документов о распределении так что мое исследование было основано на исследовании Форумов компании Apple для разработчиков, Карфагене и Realm проектов и моих собственных экспериментов с
xcodebuild
,lipo
,codesign
инструменты.Вот длинная цитата (с небольшой разметкой от меня) из ветки Форума разработчиков Apple Экспорт приложения со встроенным фреймворком :
Это описывает процесс почти так же, как @skywinder в своем ответе.
Вот как Carthage использует липо, а Realm - липо .
ВАЖНАЯ ИНФОРМАЦИЯ
Есть радар: Xcode 6.1.1 и 6.2: фреймворки iOS, содержащие фрагменты симулятора, не могут быть отправлены в App Store, и долгое обсуждение этого в Realm # 1163 и Carthage # 188 закончилось специальным обходным путем:
перед отправкой в AppStore двоичные файлы фреймворка iOS должны быть удалены из фрагментов симулятора
Карфаген имеет специальный код: CopyFrameworks и соответствующую часть документации:
В Realm есть специальный скрипт: strip-frameworks.sh и соответствующая часть документации:
Также есть хорошая статья: Удаление нежелательных архитектур из динамических библиотек в Xcode .
Я сам использовал Realm,
strip-frameworks.sh
который отлично работал у меня без каких-либо модификаций, хотя, конечно, любой может написать его с нуля.Ссылка на мою тему, которую я рекомендую прочитать, потому что она содержит еще один аспект этого вопроса: подписывание кода - Создание фреймворков iOS / OSX: необходимо ли их кодовое подписание перед распространением среди других разработчиков?
источник
Это не очень ясное решение, но я нахожу единственный способ:
Установить
ONLY_ACTIVE_ARCH=NO
вBuild Settings
Откройте в консоли
Products
папку для вашего фреймворка (вы можете открыть его через открытую папку фреймворка иcd ..
оттуда)Products
папки. Он создает в этой папке fat Framework. (или сделайте это вручную, как описано ниже в 3. 4. )Или:
Объедините эти 2 фреймворка, используя липо этим скриптом (замените
YourFrameworkName
на свое имя фреймворка)Замените новым двоичным кодом один из существующих фреймворков:
./YourFrameworkName.framework
- это готовый толстый бинарник! Вы можете импортировать его в свой проект!Для проекта, которого нет в Рабочих областях:
Вы также можете попробовать использовать эту суть, как описано здесь . Но, похоже, это не работает для проектов в рабочих областях.
источник
Debug-
папкаlipo -create
? Можно ли использовать этот фреймворк дляRelease
настройки и почему? Спасибо.Ответ @Stainlav был очень полезным, но вместо этого я скомпилировал две версии фреймворка (одну для устройства и одну для симулятора), а затем добавил следующее,
Run Script Phase
чтобы автоматически скопировать предварительно скомпилированный фреймворк, необходимый для работающей архитектуры.Таким образом, я не использую ни
lipo
для создания толстого фреймворка, ни для Realm,strip-frameworks.sh
чтобы удалить ненужные фрагменты при отправке в App Store.источник
${SRCROOT}/Frameworks/Active
папке. Они заменяются правильными предварительно скомпилированными фреймворками для активной архитектуры во время компиляции.lipo
подход «объединить, а затем разорвать» .в основном для этого я нашел очень хорошее решение. вам просто нужно выполнить эти простые шаги.
и это все. Здесь мы объединяем симулятор и версию устройства двоичного файла MyFramework, присутствующего внутри MyFramework.framework. Мы получаем универсальный фреймворк, который подходит для всех архитектур, включая симулятор и устройство.
источник
Я просто хочу обновить этот отличный ответ от @odm. Начиная с Xcode 10,
CURRENT_ARCH
переменная больше не отражает архитектуру сборки. Поэтому я изменил сценарий, чтобы вместо этого проверить платформу:Я также добавил строку, чтобы очистить целевой каталог перед копированием, потому что я заметил, что в противном случае дополнительные файлы в подкаталогах не были бы перезаписаны.
источник
Мой ответ охватывает следующие моменты:
Сделайте структуру, которая работает как для симулятора, так и для устройства
Как экспортировать «толстый» Cocoa Touch Framework (для Simulator и Device)?
Неопределенные символы для архитектуры x86_64
ld: символы не найдены для архитектуры x86_64
Шаги 1. Сначала создайте свои фреймворки с помощью Simulator target
Шаги 2: После успешного создания симулятора выполните сборку для своей платформы с выбором целевого устройства или общим выбором устройства iOS.
Шаг 3. Теперь выберите целевую платформу и для этого в разделе «Фазы сборки» выберите «Добавить сценарий выполнения» и скопируйте приведенный ниже код сценария)
Шаг 4: Теперь, наконец, соберите заново, и ваша структура готова для совместимости как с симулятором, так и с устройствами. Ура!!!!
[Примечание: у нас должны быть готовы обе совместимые платформы до последнего шага 4 (симулятор и архитектура устройства совместимы, в противном случае, пожалуйста, выполните шаги 1 и 2 выше)
См. Справочное изображение:
Поместите код ниже в область оболочки:
источник