Что такое макрос препроцессора для проверки того, строится ли расширение приложения?
Этот вопрос основан исключительно на публично выпущенных документах, касающихся внедрения расширений приложений в iOS.
С введением расширений приложений в iOS 8 теперь можно "расширить пользовательские функции и контент за пределами вашего приложения и сделать его доступным для пользователей, в то время как они используют других приложений".
В моей реализации моего расширения я включаю некоторые классы из моего фактического приложения в своем расширении (модели и т.д.). Проблема в том, что эти классы вызывают вызовы UIApplication
, которые недоступны в расширении приложения, и компилятор говорит мне об этом.
Я думал, что легкое решение этого вопроса будет заключаться в любых вызовах UIApplication
в директиве #if
.
Например, если бы я хотел включить только код, если я работал на симуляторе, я бы использовал:
#if TARGET_IPHONE_SIMULATOR
// Code Here
#endif
Есть ли аналогичный определенный макрос, когда целью является расширение приложения?
Ответы
Ответ 1
Вы можете определить свой собственный макрос.
В настройках проекта используйте раскрывающийся список в верхней панели, чтобы выбрать цель расширения:
![enter image description here]()
Тогда:
- Нажмите
Build Settings
- Найти (или выполнить поиск)
Preprocessor Macros
под Apple LLVM 6.0 - Preprocessing
- Добавьте
TARGET_IS_EXTENSION
или любое другое имя по вашему выбору в разделах отладки и выпуска.
Затем в вашем коде:
#ifndef TARGET_IS_EXTENSION
// Do your calls to UIApplication
#endif
Ответ 2
Вы можете использовать ту же технику, что и Apple, для повышения ошибки компиляции.
#if !(defined(__has_feature) && __has_feature(attribute_availability_app_extension))
//Not in the extension
#else
//In extension
#end
Ответ 3
Обновление: К сожалению, на самом деле это не работает, потому что он работает в __has_feature(attribute_availability_app_extension)
-feature. Сад.
На самом деле этого не спрашивали, но следует отметить:
Если вы используете Swift, у вас есть атрибут @available(iOSApplicationExtension)
! Это не функция препроцессора, но это своего рода функция времени компиляции.
Пример:
@available(iOSApplicationExtension, message="It is meaningless outside keyboard extension")
public var rootInputViewController: UIInputViewController {
return storedInputViewController
}
Или с # - нотация (но, вероятно, не):
public static var rootInputViewController: UIInputViewController! {
guard #available(iOSApplicationExtension 8, *) else {
return nil
}
return storedInputViewController!
}