ios uiapplicationdelegate ios-app-extension

ios - uiapplication swift



Extensión de iOS 8 Cómo detectar el funcionamiento (5)

Alguien sabe cómo detectas desde tu código si estás ejecutando dentro de una extensión de iOS 8.

Tengo una aplicación que comparte clases entre una aplicación y una extensión. El código de la aplicación utiliza [UIApplication sharedApplication] pero no está disponible desde una extensión, por lo que no compilará diciendo:

''sharedApplication'' is unavailable: not available iOS (App Extension)

Así que necesito una forma de detectar que estoy en la extensión y usar una aplicación sharedApplication si ese es el caso.


Como dice la documentación de Apple :

Cuando crea una extensión basada en una plantilla de Xcode, obtiene un paquete de extensión que termina en .appex.

Entonces, podemos usar el siguiente código:

@implementation ExtensionHelpers +(BOOL) isAppExtension { return [[[NSBundle mainBundle] executablePath] containsString:@".appex/"]; } @end


La macro del preprocesador funcionará principalmente, pero no funcionará en una biblioteca compartida (por ejemplo, cocoapods o frameworks compartidos).

Alternativamente, puede utilizar el siguiente código.

if ([[[NSBundle mainBundle] bundlePath] hasSuffix:@".appex"]) { // this is an app extension }

Este trabajo comprobando el paquete executablePath, ya que solo la extensión de la aplicación tiene la extensión ".appex".


Para mi biblioteca compartida, creé un destino separado cuyo indicador de extensiones de aplicación está establecido en sí y utilicé macros de preprocesador dentro de la configuración de compilación para ese objetivo específico.


Puede agregar una macro de preprocesador en el destino de la extensión y luego verificar con un #ifdef dentro de su clase.


Puedes usar una macro preprocesadora:

En la configuración del proyecto, use el menú desplegable en la barra superior para seleccionar el destino de su extensión:

Entonces:

  1. Haga clic en Build Settings
  2. Buscar (o buscar) Preprocessor Macros bajo Apple LLVM 6.0 - Preprocessing
  3. Agregue TARGET_IS_EXTENSION o cualquier otro nombre de su elección en las secciones de depuración y lanzamiento.

Luego en su código:

#ifndef TARGET_IS_EXTENSION // if it''s not defined // Do your calls to UIApplication #endif