ios - sirven - que es include en c++
¿Cuál es la macro del preprocesador para probar si se está construyendo una extensión de aplicación? (3)
Esta pregunta se basa exclusivamente en documentos publicados públicamente sobre la introducción de extensiones de aplicaciones en iOS.
Con la introducción de extensiones de aplicaciones en iOS 8, ahora es posible "extender la funcionalidad y el contenido personalizados más allá de su aplicación y ponerla a disposición de los usuarios mientras usan otras aplicaciones".
En la implementación de mi extensión, estoy incluyendo algunas clases de mi aplicación real en mi extensión (modelos, etc.). El problema es que estas clases hacen llamadas a UIApplication
, que no está disponible en una extensión de la aplicación, y el compilador me lo dice.
Pensé que una solución fácil sería encerrar cualquier llamada a UIApplication
en una directiva #if
.
Por ejemplo, si quisiera incluir solo código si estuviera ejecutando en un simulador, usaría:
#if TARGET_IPHONE_SIMULATOR
// Code Here
#endif
¿Hay una macro definida similar cuando el destino es una extensión de aplicación?
Actualización: desafortunadamente, en realidad no funciona porque está funcionando en __has_feature(attribute_availability_app_extension)
manera. Triste.
No es en realidad lo que se pidió, pero se debe tener en cuenta:
Si está utilizando Swift, tiene el @available(iOSApplicationExtension)
! En realidad, no es la característica del preprocesador, sino que es una característica de tiempo de compilación.
Ejemplo:
@available(iOSApplicationExtension, message="It is meaningless outside keyboard extension")
public var rootInputViewController: UIInputViewController {
return storedInputViewController
}
O con # notación ( pero probablemente no ):
public static var rootInputViewController: UIInputViewController! {
guard #available(iOSApplicationExtension 8, *) else {
return nil
}
return storedInputViewController!
}
Puedes definir tu propia macro.
En la configuración del proyecto, use el menú desplegable en la barra superior para seleccionar el destino de su extensión:
Entonces:
- Haga clic en
Build Settings
- Buscar (o buscar)
Preprocessor Macros
bajoApple LLVM 6.0 - Preprocessing
- Agregue
TARGET_IS_EXTENSION
o cualquier otro nombre de su elección en las secciones de debug y release.
Luego en tu código:
#ifndef TARGET_IS_EXTENSION
// Do your calls to UIApplication
#endif
Puedes usar la misma técnica que usa Apple para elevar el error de compilación.
#if !(defined(__has_feature) && __has_feature(attribute_availability_app_extension))
//Not in the extension
#else
//In extension
#end