Можете ли вы создавать динамические библиотеки для 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".

Скриншот 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, если он был запущен.

Теперь давайте создадим 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.

Другие вопросы по тегам