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


114

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

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

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

Я выбрал сборку Simulator -> Debug -> i386 .



4
iOS8 + поддерживает фреймворки на основе общей библиотеки.
eonil

1
@Eonil, ты можешь подробнее рассказать об этом? Я хотел бы узнать об этом больше, статья или ссылка на некоторую информацию были бы очень признательны.
Максим Четруска

Ответы:


105

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

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


14
Кто-нибудь знает, почему это так? Мне это кажется совершенно безумным.
Эрик де Кастро Лопо

73
@ Эрик де Кастро Лопо: Причина в безопасности: поскольку динамическая библиотека может быть загружена и выгружена во время выполнения, вы можете загрузить дополнительный исполняемый код и загрузить его (подумайте о плагине). Это может быть взломано хакером, и тогда запуск вредоносного кода на вашем телефоне - это очень плохо. Это также позволит добавлять неутвержденные функции в одобренное приложение. Вкратце: в этой среде Apple считает динамическое связывание ящиком Pandoras, который необходимо строго контролировать, иначе это может поставить под угрозу безопасность, и я согласен, что это имеет смысл для телефона .
DarkDust

6
Я разрабатываю собственное приложение, которое не будет распространяться через AppStore, поэтому меня не волнуют ограничения Apple для AppStore. Является ли это технически возможно создать динамическую библиотеку для IOS приложения?
Aliaksei

3
@Aliaksei: Технически да, иначе вы не смогли бы ссылаться на библиотеки Apple. Поддержка динамической библиотеки AFAIK примерно такая же, как в Mac OS X. Однако Xcode не поддерживает ее, но, похоже, вы можете использовать пакеты. См. Эту статью .
DarkDust

3
Не поддерживается - это не то же самое, что не разрешено.
dtech

162

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

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

Скриншот 1 Xcode

3. Откройте « Типы пакетов MacOSX.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, перейдите в Project-> Edit Project Settings.

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

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

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

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

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

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


2
Начиная с XCode 4.5, эти файлы можно найти (например) по адресу /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications
Крис Деверо,

@ChrisDevereux, спасибо! Я добавил примечание, чтобы проверить ваш комментарий на наличие обновленных путей ... которые, конечно, могут снова измениться в будущей версии :)
Нейт

3
Этот ответ требует большего количества голосов (и действительно должен быть принятым ответом, но я сомневаюсь, что user510951 вернется после того, как пробыл вдали от SO в течение 2 лет). Очень хороший ответ Нейт!
chown

1
Должно быть какое-то основное переопределение, где, если @chown говорит, что ответ правильный ... он чертовски правильный.
Тим

@Panagiotis, задайте новый вопрос, чтобы его можно было решить должным образом. Покажите код, который вы используете, и все сообщения об ошибках. Если хотите, вы также можете вернуться к этому вопросу / ответу. Если добавить тег "iphone-privateapi", я его увижу. Вы должны указать, что это не для магазина приложений, или люди могут проголосовать за закрытие вопроса.
Nate

0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.