Определите, является ли целевая задача запуска App Extension или iOS

У меня есть простое приложение, которое также имеет расширение iOS 8 Today (или виджет). Одна из вещей, которые я делаю, - это разделять классы кода между моим приложением и моим виджетами, потому что, очевидно, это избавляет меня от необходимости иметь несколько копий одного и того же кода. Все это прекрасно работает, кроме одной проблемы, с которой я столкнулся, один из API UIApplication sharedApplication появляется с ошибкой, потому что вы не можете использовать это в iOS 8 Widgets.

Итак, о чем я думал, есть простая инструкция if, которая проверяет, является ли конечная цель родным приложением, или если это виджет iOS 8, а затем добавить код как подходящий. Будет ли это работать?

Вот мой код:

if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]))
    {
        CGSize ssz = sz;
        sz = CGSizeMake(ssz.height, ssz.width);
    }

Как я могу изменить этот код так, чтобы он мог выполнить одно из следующих действий:

  • Только запустить/скомпилировать IF конечная цель - это родное приложение iOS, а не виджет.
  • ИЛИ проверить, доступен ли этот API на целевой платформе, а затем использовать его, если он есть?

Надеюсь, мой вопрос имеет смысл и спасибо за ваше время, Дэн.

Ответы

Ответ 1

Проверки времени выполнения отсутствуют, поскольку Xcode не позволяет компилировать код расширения, в котором используется sharedApplication. Это должна быть проверка времени компиляции.

К сожалению, эта проверка не встроена, вы должны ее добавить. Вам нужно сделать что-то вроде:

  • В настройках проекта для сегодняшнего расширения в разделе "Другие флаги C" добавьте собственный собственный макрос компилятора. Для макроса с именем TODAY_EXTENSION добавьте -DTODAY_EXTENSION:

enter image description here

  1. В вашем коде проверьте этот макрос, используя что-то вроде

    #ifndef TODAY_EXTENSION
    ... app-only code here ...
    #endif
    

    И наоборот, код, который должен существовать только в расширении, будет выглядеть как

    #ifdef TODAY_EXTENSION
    ... extension-only code here ...
    #endif
    

Ответ 2

Ответ Том прямо на. Другой альтернативой является определение макроса в файле prefix.pch для вашей цели расширения, предполагая, что вы используете отдельные файлы префикса для каждой цели.

#define TODAY_EXTENSION YES

Я лично предпочитаю этот подход, так как вы можете командовать щелчком мыши макросу, где бы он ни использовался, чтобы видеть, где он определен.