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

В 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 как описано в ответе хаги .

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

  • XCode выравнивание / интервал между Storyboard и Simulator?
  • Кнопка смены программного обеспечения
  • Запуск Экранная раскадровка, не отображающая изображение
  • ошибка xcode при загрузке файлов из песочницы
  • xcode 4.5 - символы, не найденные для архитектуры i386 (zbar)
  • «Закрытый ключ для ... не установлен на этом Mac» - профили распределения и подготовки в Xcode
  • Не удалось запустить ipa-файл в реальном устройстве IOS 10 с помощью appium 1.6.0
  • Не удалось проверить приложения для разработчиков iPhone
  • Двоичная зачистка в двух словах
  • Символическая точка останова при вызове dispatch_async со специальной очередью
  • Как передать значения из контроллера Pop Up View в контроллер предыдущего просмотра?
  • Interesting Posts

    CoreData. В чем разница между индексами и индексацией?

    Настроится на iTunes Connect, не идет процесс

    Как получить доступ к нижнему колонтитулу или заголовку определенного раздела в UITableView?

    Как правильно использовать дженерики на obj-c?

    Как выпустить CTFramesetter?

    «Ошибка метода Objective-C с необязательным требованием» после обновления до XCode 6.3 (Swift 1.2)

    itemSize не анимирует с помощью setCollectionViewLayout (toLayout, animated: true);

    Использование iOS SDK для создания plist во время выполнения?

    Перемещение панели навигации при представлении контроллера представления через подкласс UIPresentationController

    Предупреждение интеграции делегата Chartboost

    Youtube в iframe на модальном не работает в iOS Safari после того, как модальная спрятана, а затем снова открыта

    Динамический не определен, all_load недействителен?

    Требуется ли MFI, если я использую «Lightning to USB Camera Adapter» с внешним USB-устройством

    Почему для обновления пользовательского интерфейса в качестве основного потока используется однопоточная модель?

    Кто может сказать мне разницу между назначением и копией NSArray?

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