Подтвердить что ты не робот

Что означает "слабая связь" с каркасом?

В Xcode я могу установить фреймворк в "Необязательный" вместо "Требуется", что значит, что фреймворк слабо связан.

Означает ли это, что инфраструктура включена только в комплект, когда он где-то импортируется?

Я хочу, чтобы слабая связь нескольких фреймворков отладки, которые используют частный API, и я не хочу, чтобы они отображались в сборке App Store.

4b9b3361

Ответ 1

Важное примечание: Этот ответ был написан до объявления iOS 8. Хотя технические детали все еще применяются к системным рамкам, теперь можно создавать собственные динамически связанные фреймворки, которые поставляются в комплекте приложений. Существуют ограничения, например, только приложение, а его расширения могут ссылаться на один и тот же экземпляр встроенной инфраструктуры, но факт остается фактом, что пользовательская динамически связанная структура возможна с iOS 8. Если вы хотите узнать больше, обратитесь к это руководство (Использование встроенной структуры для совместного использования кода) и сеанс 416 WWDC 2014, построение современных рамок.

Оригинальный ответ: Ни одна из (платформенных) фреймворков действительно "включена в комплект". Вместо этого ваше приложение имеет ссылку ( "ссылка" ) на фреймворк, как только вы добавите его в фазу сборки "Связывание с библиотекой". Рамки предварительно установлены на устройствах. Когда вы запускаете приложение, все ссылки на инфраструктуру приложения разрешаются динамическим компоновщиком (на устройстве), что означает, что код рамки загружен, чтобы ваше приложение могло его использовать.

Некоторые фреймворки могут быть недоступны на всех устройствах, которые вы собираетесь поддерживать, например, PassKit был представлен в iOS 6. Если вы запускаете приложение, которое ссылается на PassKit на устройстве iOS 5, оно выходит из строя сразу после запуска, поскольку динамический компоновщик не может найти структуру на устройстве. Однако, если вы используете слабую ссылку PassKit, динамический компоновщик установит все символы фрейма на nil, если фреймворк не найден. Это предотвращает сбои приложения, и вы можете проверить наличие символов во время выполнения, например:

if ([PKPass class]) {
  // Class is available - use it
  PKPass *pass = [[PKPass alloc] init];
}

[PKPass class] безопасен для использования на всех устройствах/системах, поскольку символ PKPass будет nil в старых системах, а обмен сообщениями nil не является проблемой в Objective-C.

Подробнее о слабых связях: Документация Apple

Чтобы действительно ответить на ваш вопрос:

Означает ли это, что фреймворк включен только в комплект, когда он где-то импортирован?

Нет. Структура всегда будет связана с приложением. Только когда фреймворк не найден на самом устройстве, на котором работает ваше приложение, фреймворк не будет загружен.

Одним из решений было бы иметь отдельные цели для отладки и сборки хранилища приложений. Альтернатива заключается в том, чтобы не использовать встроенную фазу сборки Link Binary with Library из Xcode, но для связывания фреймворков Debug с параметрами компоновщика. Они могут быть указаны для каждой конфигурации (Debug/Release/...) отдельно, например:

Adding framework via linker flags

Если вы хотите использовать слабую ссылку, используйте -weak_framework PassKit (PassKit, конечно, просто пример здесь... вставьте имя вашей фреймворка). Если ваша структура Debug не входит в одну из каталогов фреймов по умолчанию, вам может потребоваться полный путь или изменить путь поиска Framework. Кроме того, вы должны, вероятно, использовать макросы, чтобы убедиться, что ни один из кода, использующий рамки отладки, не попадает в сборку App Store.

Изменить. Еще одна опция, поскольку Xcode 5 использует @import <FrameworkName>;. Таким образом, вы можете оставить фазу "Link Binary..." пустой и инициировать связывание фреймворков в коде. Затем вы можете использовать макросы, такие как DEBUG, чтобы убедиться, что некоторые фреймворки не используются для сборки App Store. Там отличный ответ относительно @import.

Ответ 2

Я столкнулся с слабой связью, когда я использовал iAds. Проблема заключалась в том, что если я сильно привяжу инфраструктуру iAds и запустил приложение на устройстве с SDK, которое не поддерживало iAds, тогда оно просто сработает. Слабая связь позволила избежать сбоев. Я по-прежнему считаю, что даже при слабой связи вам все равно придется проверять код, если он доступен или нет.

Ответ 3

Означает ли это, что фреймворк включен только в комплект, когда он где-то импортирован?

Это зависит от того, как вы настроили свои схемы или цели.

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

Scheme Example

UPDATE

Для этого запустите новую схему в конфигурации проекта и установите OTHER_LDFLAGS, как описано в hagi answer.

Project Configurations and Schemes