Определите, является ли целевая задача запуска 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]()
-
В вашем коде проверьте этот макрос, используя что-то вроде
#ifndef TODAY_EXTENSION
... app-only code here ...
#endif
И наоборот, код, который должен существовать только в расширении, будет выглядеть как
#ifdef TODAY_EXTENSION
... extension-only code here ...
#endif
Ответ 2
Ответ Том прямо на. Другой альтернативой является определение макроса в файле prefix.pch для вашей цели расширения, предполагая, что вы используете отдельные файлы префикса для каждой цели.
#define TODAY_EXTENSION YES
Я лично предпочитаю этот подход, так как вы можете командовать щелчком мыши макросу, где бы он ни использовался, чтобы видеть, где он определен.