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

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

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

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

3 Solutions collect form web for “Что означает «слабая связь» с каркасом?”

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

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

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

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

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

Подробнее о слабых связях: Apple Documentation

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

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

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

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

Добавление фреймворка через флаги компоновщика

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

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

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

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

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

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

Пример схемы

ОБНОВИТЬ

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

Конфигурации и схемы проекта

  • Как использовать статическую библиотеку (например, библиотеку cocoapods) на XCTest?
  • После установки XCode 7 я больше не могу создавать и запускать проекты, поскольку документ не открывается
  • iOS XMPP PubSub не принимает события при публикации узла моим подписчикам
  • Objective C - несовместимое целое число с преобразованием указателя
  • «Согласие на лицензию Xcode / iOS требует привилегий администратора, повторите запуск с правами root через sudo». При использовании GCC
  • Пример сири-намерения
  • UITableView - уйти с первого ответчика на внешний контакт
  • Приложение зависает при загрузке файла с сервера
  • Есть ли способ добавить устройство в профиль подготовки без использования портала разработчиков Apple?
  • Локализовать раскадровку, но отметить определенный текст, который нельзя перевести
  • Архивирование проекта xcode, содержащего статическую библиотеку
  • Interesting Posts

    Отрегулируйте размер шрифта UILabel, чтобы он соответствовал тексту.

    Изменение макета базового значения для iphone, влияет на расположение ipad

    Как передать токен доступа в Alamofire?

    как я могу выровнять текст моего ярлыка быстрым, чтобы он начинался в верхнем левом углу метки?

    Сортировка массива, полученная из Core Data в Swift

    Проблема в Uidatepicker Dateformat для назначенного региона

    Как проверить указатель указывает на кучу или стек памяти на iOS?

    Расширьте протокол @objc со сравнением в Swift

    Изменение canDisplayBannerAds на NO не обновляет вид, чтобы удалить рекламный баннер

    Xcode 6 при столкновении с йосемитом

    Тестирование модулей приложений в IOS

    Как определить изменения размера динамического шрифта из настроек iOS?

    Настройка способа отображения кнопки

    Загрузка изображения на сервер через node.js из приложения iOS

    Многолинейный UILabel iOS AutoLayout

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.