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

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

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

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

Выбранная мной сборка Simulator -> Debug -> i386 .

Ответы [ 2 ]

156 голосов
/ 09 мая 2012

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

Более того, ограничение по умолчанию не позволяет вам build проект динамической библиотеки для iOS - это нечто в XCode, которое вы можете переопределить, отредактировав некоторые XML-файлы XCode:

Сборка и использование dylib на iOS

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

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

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


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

1. Откройте эти файлы в редакторе списка свойств: / Developer / Platforms / MacOSX.platform / Developer / Library/ Xcode / Характеристики / MacOSX Product Types.xcspec и / Разработчик / Платформы / iPhoneSimulator.platform / Разработчик / Библиотека / Xcode / Технические характеристики / iPhone Simulator ProductTypes.xcspec

2. Найдите элемент в « MacOSX Product Types.xcspec », который имеет тип продукта com.apple.product-type.library.dynamic, и перетащите его в « iPhone Simulator ProductTypes.xcspec ».

Xcode screenshot 1

3. Открыть « Типы пакетов MacOSX.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. Rповторите шаги для « iPhoneOS.platform » и перезапустите Xcode, если он был запущен.

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

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

Теперь откройте проект с помощью Xcode, перейдите к Project-> Edit Project Settings

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

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

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

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

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

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

101 голосов
/ 19 января 2011

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

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

...