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

Поддерживаются ли динамические библиотеки на iOS (iPhone / iPad)?

В Xcode я попытался создать Новый проект -> Платформа и библиотека -> Библиотека Какао (динамическая). В настройках проекта я установил Базовый SDK на iOS device 4.1, а цель - на iOS4.1, но у него есть ошибка сборки:

target указывает тип продукта 'com.apple.product-type.library.dynamic', но для платформы 'iphonesimulator' такого типа продукта нет ».

Я выбрал сборку Симулятор -> Отладка -> i386.


person user510951    schedule 19.01.2011    source источник
comment
Нет, но вы можете создать и связать статический библиотека   -  person bobobobo    schedule 14.12.2013
comment
iOS8 + поддерживает фреймворки на основе общей библиотеки.   -  person eonil    schedule 21.06.2014
comment
@Eonil, ты можешь подробнее рассказать об этом? Я хотел бы узнать об этом больше, статья или ссылка на некоторую информацию были бы очень признательны.   -  person Maxim Chetrusca    schedule 06.08.2014
comment
ddeville.me/2014/04/dynamic-linking   -  person P i    schedule 18.03.2018


Ответы (3)


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

Однако в iOS8 вы можете использовать динамические библиотеки и фреймворки. Он должен "просто работать"

person DarkDust    schedule 19.01.2011
comment
Кто-нибудь знает, почему это так? Мне это кажется совершенно безумным. - person Erik de Castro Lopo; 29.04.2011
comment
@ Эрик де Кастро Лопо: Причина в безопасности: поскольку динамическая библиотека может быть загружена и выгружена во время выполнения, вы можете загрузить дополнительный исполняемый код и загрузить его (подумайте о плагине). Это может быть взломано хакером, и тогда запуск вредоносного кода на вашем телефоне - это очень плохо. Это также позволит добавлять неутвержденные функции в одобренное приложение. Вкратце: в этой среде Apple считает динамическое связывание ящиком Pandoras, который необходимо строго контролировать, иначе это может поставить под угрозу безопасность, и я согласен, что это имеет смысл по телефону. - person DarkDust; 29.04.2011
comment
Я разрабатываю собственное приложение, которое не будет распространяться через AppStore, поэтому меня не волнуют ограничения Apple для AppStore. Возможно ли технически создать динамическую библиотеку для приложения iOS? - person Aliaksei; 10.09.2011
comment
@Aliaksei: Технически да, иначе вы не смогли бы ссылаться на библиотеки Apple. Поддержка динамической библиотеки AFAIK примерно такая же, как и в Mac OS X. Однако Xcode не поддерживает ее, но, похоже, вы можете использовать пакеты. См. эту статью. - person DarkDust; 10.09.2011
comment
@DarkDust: … и я согласен, что это имеет смысл на телефоне. Я также согласен, если они сделают это на iPad: это сделано так, чтобы быть простым для всех, как и iPhone. У меня есть сомнения насчет Mac, но какого черта… В любом случае, спасибо за очень полезное объяснение. :-) - person Constantino Tsarouhas; 23.10.2011
comment
Не поддерживается - это не то же самое, что не разрешено. - person dtech; 28.04.2014
comment
В iOS 8 это уже не так :) developer.apple.com/library/prerelease/ios/documentation/ - person NachoSoto; 13.08.2014
comment
Просто нужно подтверждение: означает ли это, что мы можем загрузить и загрузить фреймворк из сети в iOS8 или новее? Как насчет проблемы безопасности? Пройдут ли рецензенты AppStore такое приложение? - person Itachi; 22.10.2014
comment
@Itachi: Думаю, тебе лучше задать новый вопрос (со ссылкой на этот), потому что этот вопрос был о Сможете ли вы это сделать?, а ваш вопрос больше похож на Есть ли мы позволили? И я не знаю ответа, кстати. - person DarkDust; 22.10.2014
comment
не думайте, что это просто работает, учитывая ошибку, упомянутую в вопросе - person Max MacLeod; 18.02.2016
comment
@DarkDust: Как я могу творить для iOS. \ - person Vineesh TP; 25.05.2016
comment
Для будущих людей, читающих это, чтобы решить проблему @Aliaksei, нет необходимости использовать App Store для собственных приложений. Вам просто нужно зарегистрировать учетную запись Enterprise. С корпоративной учетной записью вы можете распространять приложения iOS без необходимости добавлять устройство в профиль обеспечения, но приложение, подписанное корпоративным сертификатом, не может быть помещено в магазин приложений. - person aeskreis; 16.07.2016

Я действительно не возражаю с ответом 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, которое вы можете изменить, отредактировав некоторые файлы XCode xml:

Создайте и используйте dylib на iOS

После этого вы можете создать обычную библиотеку iOS .dylib и использовать ее в соответствии с приведенным выше примером кода. (да, вам, вероятно, придется снова разблокировать эту возможность при установке новой версии XCode).

Итак, это не техническое ограничение, а ограничение политики App Store. Если вы не ограничены магазином приложений, вы можете это сделать. Обратите внимание, что этот метод не требует взлома, хотя, если приложение находится в песочнице, он может ограничивать где могут быть загружены дилибы.

Изменить: чтобы убедиться, что эта информация не потеряна из-за гниения ссылок в будущем, вот содержание предоставленной мной ссылки о том, как включить дилибы iOS в Xcode. (Примечание: этот процесс все еще работает в Xcode 4, но см. комментарии ниже для обновлений путей и т. д.) Источник: Блог iOS Place:


Xcode не позволяет создавать dylib для iOS. Приложение будет отклонено, если оно не является одиночным двоичным кодом. Но у меня есть приложение с подключаемой архитектурой для загрузки дополнительных модулей. Мне просто нужен быстрый прототип, чтобы подтвердить концепцию, прежде чем полностью переносить ее на iOS. Это было бы быстрее, если бы дилиб мог просто работать. Итак, в этом посте показано, как создавать и использовать dylib, но имейте в виду, что он не будет одобрен для App Store. (Протестировано с Xcode 3.2.4 на 10.6.4)

1. Откройте эти файлы в редакторе списка свойств: /Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Specifications/MacOSX Product Types.xcspec и /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 ».

Скриншот Xcode 1

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 ».

Скриншот Xcode 2

5. Повторите шаги для «iPhoneOS.platform» и перезапустите Xcode, если он был запущен.

Теперь давайте создадим дилиб. Начните с шаблона «Статическая библиотека Cocoa Touch». Это должно включать в себя Foundation.framework. Вот изменения, которые я внес в шаблон для сборки dylib.

1. Откройте файл project.pbxproj (находится внутри пакета файлов проекта Xcode) в текстовом редакторе. Найдите строку «producttype», измените ее значение на com.apple.product-type.library.dynamic;

Теперь откройте проект с помощью Xcode, перейдите в Проект-> Изменить настройки проекта.

2. «Каталог установки» установлен на @executable_path/, потому что я планирую разместить dylib в том же каталоге, что и исполняемый файл приложения.

3. «Тип Mach-O» установлен на динамическую библиотеку.

4. «Исполняемое расширение» установлено на dylib.

5. «Исполняемый префикс» пуст.

6. Добавьте в библиотеку один или два простых метода и создайте ее.

Теперь создайте приложение, чтобы протестировать его. На этот раз я выбираю приложение на основе просмотра. Подключите UIButton и UILabel для вызова библиотеки и отображения ответного сообщения. Вы можете загрузить полный проект TestApp и поиграть с ним. .

person Nate    schedule 09.05.2012
comment
Начиная с XCode 4.5, эти файлы можно найти (например) по адресу /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications. - person Chris Devereux; 25.09.2012
comment
@ChrisDevereux, спасибо! Я добавил примечание, чтобы проверить ваш комментарий на наличие актуальных путей ... которые, конечно, могут снова измениться в будущей версии :) - person Nate; 25.09.2012
comment
Этот ответ требует большего количества голосов (и действительно должен быть принятым ответом, но я сомневаюсь, что user510951 вернется после того, как пробыл вдали от SO в течение 2 лет). Очень хороший ответ Нейт! - person chown; 11.11.2012
comment
Должно быть какое-то основное переопределение, где, если @chown говорит, что ответ правильный ... он чертовски правильный. - person Tim; 24.04.2013
comment
@Panagiotis, задайте новый вопрос, чтобы его можно было решить должным образом. Покажите код, который вы используете, и все сообщения об ошибках. Если хотите, вы можете также вернуться к этому вопросу / ответу. Если добавить тег iphone-privateapi, я его увижу. Вы должны указать, что это не для магазина приложений, или люди могут проголосовать за закрытие вопроса. - person Nate; 27.08.2013

Начиная с Xcode 11.4.1 динамические библиотеки не разрешены (ваш проект не будет компилироваться для всех мест назначения). Новый способ использования библиотек / фреймворков - это create-xcframework из xcodebuild.

person Carla Camargo    schedule 21.04.2020