Поддерживает ли iOS 8 динамическое связывание?

Вплоть до iOS7 Apple не поддерживала динамическое связывание из соображений безопасности. Повторное использование кода между разработчиками обычно основывалось на статических библиотеках, которые были созданы как часть исполняемого файла приложения.

Введение расширений в iOS8, похоже, немного меняет ситуацию, потому что расширения — это отдельные исполняемые файлы. Совместное использование кода между расширением и содержащим его приложением осуществляется через фреймворк. Apple говорит об этом в своих примечаниях к выпуску:

Фреймворки для iOS. Разработчики iOS теперь могут создавать динамические фреймворки. Фреймворки — это набор кода и ресурсов для инкапсуляции функциональных возможностей, полезных для нескольких проектов. Фреймворки отлично работают с расширениями, разделяя логику, которая может использоваться как основным приложением, так и связанными расширениями.

Акцент мой.

Источник: https://developer.apple.com/library/content/documentation/Xcode/Conceptual/WhatsNewXcode-Archive/Articles/xcode_6_0.html#//apple_ref/doc/uid/TP40014509-SW14

Кроме того, в руководстве для разработчиков расширений объясняется, что вы можете обмениваться кодом между расширением и содержащим его приложением через «встроенную структуру».

Источник: https://developer.apple.com/library/content/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html#//apple_ref/doc/uid/TP40014214-CH21-SW1

Мой вопрос: что такое встроенный фреймворк, чем он отличается от динамического фреймворка и действительно ли мы увидим правильное динамическое связывание в iOS8? Вся документация, которую я прочитал, кажется двусмысленной по этому поводу.


person Slavo    schedule 01.08.2014    source источник
comment
Разве нам не разрешалось использовать встроенные фреймворки или фреймворки вообще??? Имейте несколько приложений в магазине приложений, которые используют встроенную структуру, а затем просто брендинг, наложенный сверху в реальном приложении. Или я просто не понял, что вы сказали?   -  person Popeye    schedule 01.08.2014
comment
Использование фреймворков было разрешено, но все они были статическими, то есть были созданы как часть исполняемого файла. Теперь, когда у нас есть расширения, если мы продолжим делать то же самое, исполняемый файл приложения и исполняемый файл расширения будут дублировать код фреймворка (при условии, что оба связывают фреймворк). Для меня это странно, поэтому я спрашиваю, изменились ли Apple и разрешили ли нам выполнять динамическую компоновку (т. е. связать исполняемый фреймворк во время выполнения). Кроме того, в этом документе есть слова «динамическая структура».   -  person Slavo    schedule 01.08.2014
comment
ОК, я думаю, что понимаю, что вы имеете в виду, мне пришлось несколько раз прокрутить это через старый мозг, чтобы понять, но я думаю, что понял, но не думаю, что у меня есть ответ для вас, извините.   -  person Popeye    schedule 01.08.2014


Ответы (3)


«Встроенные» и «динамические» фреймворки не относятся к одному и тому же аспекту фреймворков. Они не противоположны друг другу. Во-первых, давайте определим, что такое фреймворк: на жаргоне Apple фреймворк относится к некоторому скомпилированному коду + общедоступным заголовкам указанного кода.

  • Теперь динамический фреймворк — это фреймворк, код которого был создан как динамическая библиотека. Это противоположность «статической» структуре, где код будет построен как статическая библиотека. Если вам интересно, в Википедии есть очень хорошее объяснение разницы между статической и динамической библиотекой.

  • И, наконец, встроенный фреймворк — это фреймворк, упакованный в приложение, а не установленный для всей системы, например, в «/System/Library/Frameworks».

person Ecco    schedule 16.10.2014
comment
Даже при том, что формулировка может быть разной, разве это не одно и то же понятие? Все статические фреймворки должны быть связаны с кодом вашего приложения. Результатом является один исполняемый файл, поэтому вы говорите, что все статические фреймворки являются встроенными фреймворками. Тогда это не отвечает на мой вопрос. Существуют ли в iOS8 невстроенные динамически связанные фреймворки? - person Slavo; 17.10.2014
comment
Вы можете распространять статическую структуру отдельно от приложения. Например, подумайте о Google Analytics. Существуют ли в iOS8 невстроенные динамически связанные фреймворки?: Конечно: все системные фреймворки (Foundation, UIKit и т. д.) - person Ecco; 17.10.2014

Встроенная платформа — это просто та, которая включена в комплект приложения, а не глобальная платформа, установленная в системном каталоге.

person Droppy    schedule 01.08.2014
comment
Хорошо, но в этом случае это все еще статическая структура. Почему Apple использует слово «динамический» в примечаниях к выпуску? - person Slavo; 01.08.2014
comment
@Славо Извините; да он динамический. - person Droppy; 01.08.2014

Динамические фреймворки не означают динамически связанные фреймворки. Приложения по-прежнему работают только в среде песочницы. Не похоже, что ваши пользовательские фреймворки будут установлены вместе с iOS. Каждое из ваших приложений, использующих общую структуру, которую вы разработали, будет скопировано внутри каждого пакета приложений.

Вы можете убедиться в этом сами. Перейдите в каталог Derived Data вашего Xcode и внутри данных приложения вы найдете все скопированные встроенные фреймворки.

Единственная новая вещь в создании фреймворков с iOS 8 по сравнению со статическими библиотеками заключается в том, что общедоступные заголовочные файлы и активы объединяются в фреймворк. Если вы делали подобные вещи с более ранними версиями Xcode, вы помните боль с предоставлением общедоступных заголовков, а затем добавлением пути поиска в настройках Xcode и для активов, которые мы должны были передать в отдельном пакете.

Единственным недостатком использования фреймворков, который я вижу, является то, что теперь мы не можем просто использовать lipo для создания объемной статической библиотеки для всех типов архитектур.

ИМО Apple использует слово «динамический», чтобы предложить «независимый».

Посмотрите WWDC2014 — Building Modern Frameworks, чтобы узнать больше.

person chunkyguy    schedule 02.10.2014
comment
Динамические фреймворки на самом деле означают динамически связанные фреймворки в мире iOS/OS X. Просто создайте пример платформы iOS и выполните файл MyLib.framework/MyLib и посмотрите, насколько это динамически подключаемая общая библиотека Mach-O. - person Ecco; 16.10.2014
comment
То есть вы хотите сказать, что все пользовательские фреймворки, которые мы пишем, будут динамически доступны всем остальным? - person chunkyguy; 16.10.2014
comment
Нет, iOS этого не позволит. ОС не позволит вам загружать динамическую библиотеку из-за пределов песочницы вашего приложения. Системные фреймворки находятся внутри песочницы, а фреймворки из других приложений — нет. Фреймворки были введены в iOS 8, чтобы вы могли обмениваться кодом между вашим основным приложением и расширениями. Оба они могут загружать фреймворки изнутри контейнера вашего приложения. Другие приложения не могут. - person Ecco; 16.10.2014
comment
ОК, @Ecco, кажется, теперь я понял. Теоретически они связаны динамически, но механизм безопасности ОС (песочница) не позволяет связывать какие-либо фреймворки за пределами песочницы. Можно ли их использовать на взломанных устройствах? - person Slavo; 17.10.2014