Чи можете ви створити динамічні бібліотеки для iOS і завантажити їх під час виконання?


114

Чи підтримуються динамічні бібліотеки на iOS (iPhone / iPad)?

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

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

Вибрана я збірка - Симулятор -> Налагодження -> i386 .



4
iOS8 + підтримує рамки, засновані на спільній бібліотеці.
eonil

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

Відповіді:


105

У той час, коли це питання було задано, динамічні бібліотеки iOS не підтримувались, і це призведе до відхилення вашої програми. Допускаються лише статичні бібліотеки.

Однак в iOS8 можна використовувати динамічні бібліотеки та рамки. Він повинен "просто працювати"


14
Хтось знає, чому це? Мені це здається абсолютно божевільним.
Ерік де Кастро Лопо

73
@Erik de Castro Lopo: Причина - безпека: оскільки динамічну бібліотеку можна завантажувати та вивантажувати під час виконання, ви можете завантажити додатковий виконуваний код і завантажити його (думаю, плагін). Це може зламатись хакером, і тоді зловмисний код виконувати на вашому телефоні - це дуже погано. Це також дозволить додати не затверджені функції до затвердженого додатка. Коротше кажучи: в цьому середовищі Apple розглядає динамічне посилання як коробку Пандораса, яку необхідно суворо контролювати, інакше це може загрожувати безпеці, і я погоджуюся, що це має сенс у телефоні .
DarkDust

6
Я розробляю внутрішній додаток, який не поширюватиметься через AppStore, тому я не переймаюся обмеженнями Apple щодо AppStore. Чи технічно можливо створити динамічну бібліотеку для додатка iOS?
Аліаксей

3
@Aliaksei: Технічно так, інакше ви не зможете зв’язатися з бібліотеками Apple. Динамічна підтримка бібліотеки AFAIK приблизно така сама, як у Mac OS X. Однак Xcode не підтримує її, але, здається, ви можете використовувати пакети. Дивіться цю статтю .
DarkDust

3
Не підтримується - це не те, що заборонено.
dtech

162

Я на насправді не згодні з відповіддю DarkDust в , але якщо я можу направити свій внутрішній Білл Клінтон, це залежить від того, який сенс підтримується це :)

Apple не хоче, щоб ви це робили для додатків App Store, але операційна система, безумовно, це дозволяє. Програми Jailbreak використовують цю техніку постійно. Ви в основному використовуєте стандартну техніку UNIX, щоб динамічно відкривати рамку / бібліотеку, а потім використовувати в ній речі. Функція dlopen дозволяє відкрити бібліотеку, пройшовши шлях до цього фрейму або dylib. Ось деякі документи для створення програм джейлбрейка , ось приклад виклику init()функції, реалізованої всередині вашого власного окремого дилібу:

#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. Якщо ви не обмежені 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 Тип продукту .xcspec та /Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/pecifications / iPhone Simulator ProductTypes.xcspec

2. Знайдіть елемент у " Тип продукту MacOSX.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, якщо він працював.

Тепер давайте побудуємо диліб. Почніть з шаблону " Статична бібліотека какао-сенсорного ". Це має включати в проект Foundation.framework. Ось зміни, які я вніс у верхній частині шаблону для створення дилібу.

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

Тепер відкрийте проект за допомогою Xcode, перейдіть до Project-> Edit Settings Settings

2. " Каталог інсталяції " встановлено @executable_path/тому, що я планую помістити dylib у ту саму директорію, що і виконувану програму.

3. " Тип Mach-O " встановлено у динамічній бібліотеці

4. " Виконане розширення " встановлено на діліб

5. « Виконувані Приставка » набір спорожнити

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

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


2
Станом на XCode 4.5 ці файли можна знайти за адресою (напр.) /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Specifications
Chris Devereux

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

3
Ця відповідь потребує більше оновлень (і це дійсно має бути прийнятою відповіддю, але я сумніваюсь, що користувач510951 повернеться після відсторонення від 2-х років). Дуже приємна відповідь Нейт!
човен

1
Там, якщо @chown скаже, що відповідь є правильним ... це чорт-добре правильний.
Тім

@ Panagiotis, будь ласка, опублікуйте нове запитання, щоб це можна було вирішити належним чином. Показати використовуваний код та всі повідомлення про помилки. Якщо ви хочете, ви також можете посилання на це питання / відповідь. Якщо ви додасте тег "iphone-privateapi", я побачу його. Слід зазначити, що це не для магазину додатків, або люди можуть проголосувати, щоб закрити питання.
Нейт

0

Починаючи з Xcode 11.4.1 динамічні бібліотеки заборонені (ваш проект не буде компілюватися для всіх напрямків). Новим способом використання libs / frameworks є create-xcframework від xcodebuild.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.