Можете ли вы создавать динамические библиотеки для iOS и загружать их во время выполнения?
Поддерживаются ли динамические библиотеки на iOS (iPhone/iPad)?
В Xcode я попытался создать новый проект -> Framework & Library -> Cocoa Library (динамический). В настройках проекта я установил Базовый SDK на iOS device 4.1
и цель iOS4.1
, но есть ошибка сборки:
target указывает тип продукта "com.apple.product-type.library.dynamic", но для платформы "iphonesimulator" такого типа продукта не существует.
Я выбрал сборку Simulator -> Debug -> i386.
2 ответа
В то время, когда задавался этот вопрос, динамические библиотеки не поддерживались iOS, что приведет к отклонению вашего приложения. Разрешены только статические библиотеки.
Однако в iOS8 вы можете использовать динамические библиотеки и фреймворки. Это должно "просто работать"
Я на самом деле не согласен с ответом DarkDust, но если я смогу направить свой внутренний Билл Клинтон, это зависит от того, что означает поддерживаемый:)
Apple не хочет, чтобы вы делали это для приложений App Store, но операционная система, безусловно, позволяет это делать. Приложения для джейлбрейка используют эту технику постоянно. Вы в основном используете стандартную технику UNIX для динамического открытия фреймворка / библиотеки, а затем используете в ней вещи. Функция dlopen позволяет открывать библиотеку, передавая путь к этой платформе или dylib. Из некоторых документов по созданию приложений для джейлбрейка приведен пример вызова init()
Функция реализована внутри собственного, отдельного dylib:
#include <dlfcn.h>
initWrapper() {
char *dylibPath = "/Applications/myapp.app/mydylib2.dylib";
void *libHandle = dlopen(dylibPath, RTLD_NOW);
if (libHandle != NULL) {
// This assumes your dylib’s init function is called init,
// if not change the name in "".
void (*init)() = dlsym(libHandle, "init");
if (init != NULL) {
init();
}
dlclose(libHandle);
}
}
Кроме того, ограничение по умолчанию, запрещающее создание проекта динамической библиотеки для iOS, - это нечто в XCode, которое вы можете переопределить, отредактировав некоторые XML-файлы XCode:
Сборка и использование dylib на iOS
Как только вы это сделаете, вы можете создать обычную библиотеку iOS .dylib и использовать ее в соответствии с приведенным выше примером кода. (да, вам, вероятно, придется снова разблокировать эту возможность всякий раз, когда вы устанавливаете новую версию XCode).
Таким образом, это не техническое ограничение, а ограничение политики App Store. Если вы не ограничены в App Store, тогда вы можете сделать это. Обратите внимание, что этот метод не требует джейлбрейка, хотя, если приложение помещено в "песочницу", оно может ограничивать, откуда можно загружать dylibs.
Редактировать: чтобы удостовериться, что эта информация не будет потеряна для будущей гнили ссылки, вот содержание ссылки, которую я предоставил о том, как включить iOS dylibs в XCode. (Примечание: этот процесс все еще работает на Xcode 4, но см. Комментарий (ы) ниже для обновлений путей и т.д.) Источник - блог Места iOS:
Xcode не позволяет вам создавать dylib для iOS. Приложение будет отклонено, если это не один двоичный файл. Но у меня есть приложение с подключаемой архитектурой для загрузки дополнительных модулей. Я просто хочу быстрый прототип, чтобы доказать концепцию, прежде чем полностью перенести его на iOS. Это быстрее сделать, если dylib может просто работать. Итак, этот пост показывает, как создавать и использовать dylib, но имейте в виду, что он не будет одобрен в App Store. (Протестировано с Xcode 3.2.4 на 10.6.4)
1. Откройте эти файлы в редакторе списка свойств: /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Product Types.xcspec and /Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specifications / iPhone Simulator ProductTypes.xcspec
2. Найдите элемент в "MacOSX Product Types.xcspec", который имеет тип продукта com.apple.product-type.library.dynamic
и перетащите его в "iPhone Simulator ProductTypes.xcspec".
3. Откройте "MacOSX Package Types.xcspec" и "iPhone Simulator PackageTypes.xcspec", найденные в тех же местах.
4. Найдите элемент в "MacOSX Product Types.xcspec", который имеет тип пакета com.apple.package-type.mach-o-dylib
и перетащите его в "iPhone Simulator PackageTypes.xcspec".
5. Повторите шаги для "iPhoneOS.platform" и перезапустите Xcode, если он был запущен.
Теперь давайте создадим dylib. Начните сшаблона "Статическая библиотека Cocoa Touch". Это должно включать Foundation.framework в проекте. Вот изменения, которые я сделал в дополнение к шаблону для сборки dylib.
1. Откройте файл project.pbxproj (находится внутри пакета файлов проекта Xcode) в текстовом редакторе. Найдите строку "producttype", измените ее значение на com.apple.product-type.library.dynamic
;
Теперь откройте проект с помощью Xcode, зайдите в Project-> Edit Project Settings
2. "Каталог установки" установлен в @executable_path/
потому что я планирую поместить dylib в тот же каталог, что и исполняемый файл приложения.
3. "Тип Mach-O" установлен в Динамическую библиотеку
4. "Расширение исполняемого файла" установлено на dylib
5. "Исполняемый префикс" установлен пустым
6. Добавьте один или два простых метода в библиотеку и соберите ее.
Теперь создайте приложение для его тестирования. На этот раз я выбираю приложение на основе просмотра. Подключите UIButton и UILable, чтобы вызвать lib и показать ответное сообщение. Вы можете скачать полный проект TestApp и поиграть с ним.
Начиная с Xcode 11.4.1 динамические библиотеки не допускаются (ваш проект не будет компилироваться для всех мест назначения). Новый способ использования библиотек / фреймворков - это create-xcframework из xcodebuild.