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

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

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

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

Выбранный сборник Симулятор → Отладка → i386.

Ответ 1

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

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

Ответ 2

Я на самом деле не согласен с ответом 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 dylibs 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

Сделав это, вы можете создать обычную .dylib- библиотеку iOS и использовать ее в соответствии с приведенным выше примером кода. (да, вам, вероятно, придется снова разблокировать эту возможность всякий раз, когда вы устанавливаете новую версию 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 ".

Xcode screenshot 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 screenshot 2

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

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

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

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

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

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

4. " Расширение исполняемого файла " установлено на dylib

5. " Исполняемый префикс " установлен пустым

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

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