Роз'яснення iOS Static vs Dynamic frameworks


115

Мушу визнати, що з випуском iOS 8 я трохи заплутався у динамічних та статичних рамках в iOS.

Я шукаю спосіб розповсюдження створеної мною бібліотеки, і мені потрібно підтримувати iOS 7 і вище. (Примітка. Це буде власником. Я не можу використовувати стручки какао, а також не можу розповсюджувати джерело). Ось що я вже знаю:

  • iOS 8 представив "вбудовані рамки" для iOS, але, наскільки я розумію, вони не працюють для iOS 7, лише для iOS 8 і вище.
  • У мене є можливість поширити свою бібліотеку як статичну бібліотеку (файл .a), а також поширити заголовки. Я знаю, що це звичайний спосіб вирішення ситуації, але я хотів би знайти щось простіше, ніж це (а також зв'язати з ним деякі ресурси, якщо це можливо).
  • Я також виявив, що iOS 7 не підтримує динамічні бібліотеки .framework (лише статичні), оскільки він не підтримує динамічне посилання. Але iOS 8 робить, а також статичне з'єднання.

І ось мої запитання щодо цієї інформації:

  • Я побачив, що я можу створити ціль .framework і зробити його статичним, змінивши тип Mach-O на "статичну бібліотеку. Цього буде достатньо для того, щоб без проблем підтримувати iOS 7, а також розподіляти свою бібліотеку як Якщо так, то чому "вбудовані рамки" в iOS 8 настільки великі угоди, оскільки багато ресурсів в Інтернеті підказують? Я щось пропускаю?
  • Чи потрібно кодувати дизайн .framework так само, як я роблю з будь-яким іншим додатком, який я роблю?
  • Що робити, якщо мені потрібно включити інші ресурси (наприклад, Основні дані чи зображення) до мого файлу .framework? Чи потрібно мені для цього зробити окремий файл .bundle?

1
"iOS 7 не підтримує бібліотеки .framework, оскільки він не підтримує динамічне посилання" Це твердження невірне.
Мідхун МП

1
Я бачу. ви можете сказати мені правильне речення? Це неправда, тому що iOS 7 підтримує динамічне посилання або тому, що iOS 7 підтримує бібліотеки .framework? Або обоє?
csotiriou

1
Remeber AVFoundation та CoreGraphics - це .framework. Можливо, це допоможе вам знайти відповіді на всі ваші запитання: raywenderlich.com/65964/create-a-framework-for-ios
Мідхун, депутат

Я зафіксував речення. Я вже прочитав посилання, перш ніж розмістити свої запитання. Цей посилання нічого не пояснює стосовно моїх запитань. Він починається зі статичної бібліотеки і запускає його у файл .framework РУЧНО. Я говорю про ціль Cocoa Touch Framework в Xcode 6, а потім змінити тип у статичну бібліотеку. У ньому не згадується підписання коду (чому і якщо це потрібно), додаткових ресурсів тощо
csotiriou

1
Ви можете використовувати CocoaPods для розповсюдження фірмової системи (наприклад, Parse)
Рік Сантос

Відповіді:


69

Перед iOS8 Xcode дозволяв лише можливість створення статичних бібліотек для iOS. Спільною проблемою було те, що ми повинні були перевозити двійкові та заголовки окремо.

Пізніше деякі розробники прийшли з ідеєю створити "статичні рамки". [.framework - це лише папка з символічними посиланнями на ліб та заголовки]. Одним із таких прикладів є https://github.com/jverkoey/iOS-Framework

Ця опція буде працювати для iOS 7 або 8 або раніше. Оскільки вони - лише статичні бібліотеки із зручністю поєднання файлів заголовків.

Що стосується ваших запитань про ресурси, нам потрібно було б з'єднати їх у ".bundle". Для доставки їх я не впевнений, чи зможемо ми вкласти їх у папку .framework. Раніше я передавав свої лібрики як статичний каркас і комплект ...

Однак вищевказаний варіант не підійде для вас, якщо ви використовуєте Swift. Xcode не підтримує побудову статичних бібліотек, які містять швидкий код.

Ви повинні користуватися динамічними рамками, якщо є швидке використання. Теоретично, динамічні рамки працюють в iOS7 .. Але, я думаю, iTunes Connect відхилить, якщо додаток орієнтується на iOS7 і використовує динамічні рамки :-).

Сподіваюся, це допомагає


16

З Xcode 9 ви також можете створювати статичні рамки для Swift. Це можливо завдяки сумісності джерел ABI. Все, що вам потрібно зробити, - це просто змінити Mach-O typeналаштування в рамках збірки рамкової цілі. Ця методика також застосовна до гібридних фреймворків (фреймворки з кодом Swift та Objective-C).


Чудова порада. Не знаю, чому ця відповідь була забита, як це допомогло мені. \ Target'Build Settings \ Mach-O-Type та виберіть Static Framework.
rustyMagnet

3
Сумісність Abi не доступна в швидкому 4
csotiriou

7

staticабо dynamicв імені зазвичай вказує на тип Linking[About]

Рамки можуть бути staticабо dynamic[Перевірити статичну чи динамічну]

Ви можете змінити формат бібліотеки, який матиме вплив на a Linker, змінивши Framework target -> Build Settings -> Mach-O Type[About] на Static Libraryабо Dynamic Library. За замовчуванням Xcode має Dynamic Libraryзначення.

Залежно від цього параметра будуть створюватися різні типи двійкових

Після того як ви успішно налаштували споживача [Посилання проти вставки]

Static Linker ld : під час компіляції буде включати весь код з static libraryфайлу у виконуваний об'єктний файл.

Dynamic Linker dyld : під час завантаження / запуску спробує знайти вбудований фреймворк за допомогою @rpath[About] та зв’язати його

[Лексика]


6

Свіфт не працює в статичній лінзі. Якщо вам доведеться використовувати динамічний фреймворк, вам потрібно встановити min iOS на 8.0, оскільки AppStore відкидає ios 7 з динамічним фреймом


Ви можете імпортувати статичну бібліотеку у швидкий проект на основі
C0D3

5

У мене немає всіх відповідей, але я спробую вирішити деякі ваші запитання тут.

  • Ви отримаєте попередження про використання цих фреймворків в iOS 7, однак це все, що це, попередження. Дивіться цю відповідь .

  • Ви можете включити інші ресурси, такі як CoreData, однак вам потрібно буде створити їх у коді вручну. Ось підручник, який показує, як створити основні моделі даних.

  • Ви повинні кодувати динамічні бібліотеки для iOS.

  • Вам потрібно переконатися, що ваш фреймворк підтримує як симулятор, так і архітектуру пристроїв, якщо ви плануєте його розповсюджувати.

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