Подтвердить что ты не робот

Что такое макрос препроцессора для проверки того, строится ли расширение приложения?

Этот вопрос основан исключительно на публично выпущенных документах, касающихся внедрения расширений приложений в iOS.

С введением расширений приложений в iOS 8 теперь можно "расширить пользовательские функции и контент за пределами вашего приложения и сделать его доступным для пользователей, в то время как они используют других приложений".

В моей реализации моего расширения я включаю некоторые классы из моего фактического приложения в своем расширении (модели и т.д.). Проблема в том, что эти классы вызывают вызовы UIApplication, которые недоступны в расширении приложения, и компилятор говорит мне об этом.

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

Например, если бы я хотел включить только код, если я работал на симуляторе, я бы использовал:

#if TARGET_IPHONE_SIMULATOR
    // Code Here
#endif

Есть ли аналогичный определенный макрос, когда целью является расширение приложения?

4b9b3361

Ответ 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!
}