Prácticas recomendadas para aplicaciones iOS

27 de febrero de 2018

Cuando desarrolle aplicaciones iOS, use los procedimientos recomendados que se describen en este artículo, que tienen por finalidad mejorar la compatibilidad entre XenMobile y las aplicaciones móviles para dispositivos iOS.

MDX App SDK Framework y el empaquetado

Si la aplicación utiliza el MDX App SDK Framework, debe usar la versión coincidente de MDX Toolkit para empaquetar. Si las versiones de estos dos componentes no coinciden, el funcionamiento posterior de la aplicación puede no ser correcto.

Para evitar este tipo no problema, empaquete la aplicación como ISV e indique el tipo Premium o General. Eso permite entregar una aplicación empaquetada previamente. Como resultado, el cliente no necesitará empaquetar la aplicación, y así se evitará el uso de un MDX Toolkit de otra versión. Para obtener más información sobre cómo empaquetar aplicaciones ISV, consulte Empaquetado de aplicaciones móviles iOS en la documentación del MDX Toolkit.

Utilice identificadores explícitos de aplicación

Si la cuenta de empresa de desarrollador iOS no admite caracteres comodín en los ID de aplicación, debe crear un ID de aplicación explícito para cada aplicación que quiera empaquetar con el MDX Toolkit. Además, debe crear un perfil de aprovisionamiento para cada ID de aplicación.

No bloquee el subproceso principal

No debe usar código de bloqueo cuando ejecute procesos en el subproceso principal. Esta es una directriz de Apple, pero es incluso más importante cuando se trata de XenMobile. Algunas acciones pueden tardar más tiempo en una aplicación administrada o pueden incluso bloquear la ejecución posterior del subproceso. Las operaciones de red, de archivo o de base de datos son ejemplos de las operaciones que pueden bloquear el subproceso en ejecución cuando se emiten, por lo que se deben evitar en el subproceso principal.

Escriba un código sólido

En concreto, debe escribir aplicaciones siguiendo los procedimientos recomendados que se describen en las guías de programación de Apple, como Apple Application Programming Guide.

Use solo las interfaces publicadas de Apple.

Siempre compruebe los valores de retorno de todas las llamadas de API y gestione las excepciones que puedan surgir como consecuencias de una llamada de API, para garantizar una buena recuperación frente a errores o un cierre correcto de la aplicación. Aunque esta es solo una recomendación frecuente para una mejor programación, es muy importante para las aplicaciones administradas.

Varias API que suelen funcionar siempre fallarán si las directivas de XenMobile bloquean la funcionalidad subyacente. Entre los ejemplos se incluyen las capacidades descritas anteriormente:

  • Las API de red actúan como si no hubiera red alguna.
  • Las API de sensores, como el GPS y la cámara, devuelven valores nulos o inician una excepción.

Los siguientes selectores en ejecución de Objective-C devolverán un valor nulo si las directivas de XenMobile bloquean la funcionalidad subyacente. Por eso, deben solucionarse según corresponda.

Clase del objeto Nombre del selector
AVCaptureDevice devicesWithMediaType:
MFMailComposeViewController init:
MFMessageComposeViewController initWithNibName:bundle:
NSFileManager URLForUbiquityContainerIdentifier:
NSUbiquitousKeyValueStore defaultStore:
PHPhotoLibrary sharedPhotoLibrary:
UIImagePickerController availableCaptureModesForCameraDevice:
UIPasteboard dataForPasteboardType:
  valueForPasteboardType:
  items:
  dataForPasteboardType:inItemSet:
  valuesForPasteboardType:inItemSet:
UIPopoverController initWithContentViewController:
UINavigationController ctxInitWithRootViewController:
  ctxPopToViewController:animated:

Redirija las interfaces en ejecución

XenMobile solicita el PIN desde la interfaz de usuario, de modo que no es necesario pedirlo desde la aplicación.

Para garantizar la disponibilidad de XenMobile, se recomienda no redirigir ni sustituir selectores en ejecución de Objective-C, porque XenMobile reordena los métodos subyacentes de varios selectores de clase de objeto para controlar y/o modificar el comportamiento de ejecución de una aplicación. En la siguiente tabla se ofrece una lista de los selectores de clase Objective-C que XenMobile redirige:

Nombre de clase del objeto Nombre del selector
NSURLProtectionSpace serverTrust
NSURLAuthenticationChallenge sender
NSURLConnection sendSynchronousRequest:returningResponse:error:
  initWithRequest:delegate:startImmediately:
  initWithRequest:delegate:
  connectionWithRequest:delegate:
NSURLConnectionDelegate connection:canAuthenticateAgainstProtectionSpace:
  connection:didReceiveAuthenticationChallenge:
  connection:willSendRequestForAuthenticationChallenge:
NSURLSessionConfiguration defaultSessionConfiguration
  ephemeralSessionConfiguration
ALAssetsLibrary authorizationStatus
AVAudioRecorder record
  prepareToRecord
  recordForDuration:
  recordAtTime:
  recordAtTime:ForDuration:
AVAudioSession recordPermission
AVCaptureDevice devices
  devicesWithMediaType:
AVAsset assetWithURL:
AVURLAsset initWithURL:options:
  URLAssetWithURL:options:
AVPlayerItem playerItemWithAsset:
  initWithURL:
  playerItemWithURL:
AVPlayer playerWithPlayerItem:
  initWithPlayerItem:
  initWithURL:
CLLocationManager startUpdatingLocation
UIScrollView setContentOffset:
MFMailComposeViewController canSendMail
  init
MFMessageComposeViewController canSendText
  initWithNibName:bundle:
NSFileManager URLForUbiquityContainerIdentifier:
NSUbiquitousKeyValueStore defaultStore
PHPhotoLibrary authorizationStatus
QLPreviewController setDataSource:
  canPreviewItem:
QLPreviewControllerDataSource numberOfPreviewItemsInPreviewController:
  previewController:previewItemAtIndex:
SLComposeViewController isAvailableForServiceType:
UIActivityViewController initWithActivityItems:applicationActivities:
  setExcludedActivityTypes:
UIApplication openURL:
  canOpenURL:
  setApplicationIconBadgeNumber:
UIDocument closeWithCompletionHandler:
  contentsForType:error:
UIDocumentInteractionController interactionControllerWithURL:
  setURL:
  setDelegate:
  presentPreviewAnimated:
  presentOpenInMenuFromBarButtonItem:animated:
  presentOpenInMenuFromRect:inView:animated:
  presentOptionsMenuFromBarButtonItem:animated:
  presentOptionsMenuFromRect:inView:animated:
UIDocumentMenuViewController initWithDocumentTypes:inMode:
UIImage imageNamed:
UIImagePickerController setSourceType:
  takePicture
  startVideoCapture
  isSourceTypeAvailable:
  isCameraDeviceAvailable:
  isFlashAvailableForCameraDevice:
  availableCaptureModesForCameraDevice:
  setMediaTypes
UINavigationController ctxInitWithRootViewController:
  ctxPushViewController:animated:
  ctxPopToViewController:animated:
UIPasteboard generalPasteboard
  pasteboardWithName:create:
  pasteboardWithUniqueName
  setValue:forPasteboardType:
  setData:forPasteboardType:
  setItems:
  addItems:
  dataForPasteboardType:
  valueForPasteboardType:
  numberOfItems
  pasteboardTypes
  pasteboardTypesForItemSet:
  containsPasteboardTypes:
  containsPasteboardTypes:inItemSet:
  elementos
  itemSetWithPasteboardTypes:
  dataForPasteboardType:inItemSet:
  valuesForPasteboardType:inItemSet:
  cadena
  cadenas
  dirección URL
  direcciones URL
  imagen
  imágenes
  color
  colores
UIPopoverController initWithContentViewController
UIPrintInteractionController isPrintingAvailable
  presentAnimated:completionHandler:
  presentFromBarButtonItem:animated:completionHandler:
  presentFromRect:inView:animated:completionHandler:
UIViewController presentViewController:animated:completion:
UIWebView loadRequest:
  setDelegate:
UIWebViewDelegate webView:shouldStartLoadWithRequest:navigationType:
  webViewDidStartLoad:
  webViewDidFinishLoad:
  webView:didFailLoadWithError:
UIWindow makeKeyAndVisible
UIApplicationDelegate applicationDidFinishLaunching:
  application:didFinishLaunchingWithOptions:
  application:willFinishLaunchingWithOptions:
  applicationWillResignActive:
  applicationDidEnterBackground:
  applicationWillEnterBackground:
  applicationDidBecomeActive:
  applicationWillTerminate:
  application:openURL:sourceApplication:annotation:
  application:handleOpenURL:
  applicationProtectedDataWillBecomeUnavailable:
  applicationProtectedDataDidBecomeAvailable:
  application:performFetchWithCompletionHandler:
  application:handleEventsForBackgroundURLSession:completionHandler:
  application:didReceiveLocalNotification:
  application:didReceiveRemoteNotification:
  application:didReceiveRemoteNotification:fetchCompletionHandler:
  application:didRegisterForRemoteNotificationsWithDeviceToken:
  application:didFailToRegisterForRemoteNotificationsWithError:
  applicationSignificantTimeChange:
  application:shouldAllowExtensionPointIdentifier:
QLPreviewController allocWithZone:

Cifrado de datos y iOS 9

Importante:

Las aplicaciones empaquetadas con MDX Toolkit 10.0.x no se pueden ejecutar en iOS 9. Los desarrolladores deben volver a empaquetar las aplicaciones ISV con el MDX Toolkit 10.2. Los usuarios deben instalar las aplicaciones actualizadas antes de actualizar sus dispositivos a iOS 9. Si los usuarios intentan abrir en iOS 9 aplicaciones empaquetadas con el MDX Toolkit 10.0.x, no podrán actualizar esas aplicaciones y tendrán que volver a instalar una versión de ellas empaquetada con el MDX Toolkit 10.2.

En consecuencia de los cambios realizados en iOS 9, el cifrado MDX ya no es compatible con iOS 9 cuando se trata de datos descargados a un dispositivo iOS 9 desde una aplicación empaquetada. Apple requiere un código de acceso al dispositivo para cifrar los datos de las aplicaciones presentes en él con el cifrado de archivos de Apple. Puede elegir entre las siguientes opciones de protección de datos:

  • De forma predeterminada, las aplicaciones empaquetadas requerirán un PIN o código de acceso en un dispositivo iOS 9.
  • Además de requerir un PIN o un código de acceso, también puede especificar una versión mínima de clase de protección de datos iOS que se usará para los datos de aplicación, a menos que la aplicación ya tenga especificado un nivel de protección más alto en iOS.

Para respaldar el nivel de protección de iOS, MDX Toolkit 10.2 incluye una directiva nueva de códigos de acceso al dispositivo que requiere la introducción de un PIN o un código de acceso en un dispositivo iOS 9. De manera predeterminada, esta directiva está establecida en . La directiva se aplica aplicación por aplicación, y se puede usar tanto en el modo MAM como en el modo MDM de XenMobile.

Las aplicaciones empaquetadas con MDX Toolkit 10.2 utilizan el cifrado MDX solo para bases de datos SQLite y llaveros. Las bases de datos SQLite forman la raíz subyacente del modelo más complejo de Apple Core Data Persistent Storage (almacenamiento persistente de datos principales) de Apple. Los demás modelos de datos principales de Apple dependen de objetos de archivo en el sistema de archivos de Apple o en el sandbox de las aplicaciones.

Otras directivas y iOS 9:

  • La entropía de usuario, habilitada mediante la clave Encrypt secrets using Passcode, no se ve afectada por iOS 9. No hay repercusiones para el llavero ni el almacén seguro presentes en el dispositivo.
  • En dispositivos iOS 9, la directiva “Habilitar cifrado” ahora permite únicamente el cifrado de bases de datos y llaveros. Para dispositivos iOS anteriores, la directiva “Habilitar cifrado” aún permite habilitar también el cifrado de archivos MDX.
  • Para obtener protección adicional en dispositivos con un código de acceso habilitado, el MDX App SDK también incluye un mayor nivel de cifrado iOS para los archivos que esas aplicaciones almacenan en el dispositivo. El cifrado de archivos de iOS ofrece varios niveles de protección de datos. La nueva directiva “Minimum data protection class” (Clase mínima de protección de datos) permite especificar la clase de protección que se usará para los datos de aplicación, a menos que la aplicación en sí tenga especificado un nivel de protección más alto en iOS. Los valores de la directiva son:

Complete unless open (Protección completa a menos que esté abierto). Si un archivo está abierto en el momento de bloquearse un dispositivo, el archivo sigue estando disponible para la aplicación. Este valor corresponde a NSFileProtectionCompleteUnlessOpen. Este es el valor predeterminado.

Complete. Cuando un dispositivo se bloquea, los archivos dejan de estar disponibles Este valor corresponde a NSFileProtectionComplete.

Until first unlock (Protección completa hasta primera apertura). Cuando el dispositivo se reinicia, los archivos están bloqueados y no se pueden leer hasta que el usuario desbloquea el dispositivo por primera vez. Este valor corresponde a NSFileProtectionCompleteUntilFirstUserAuthentication.

None (Ninguna). Los archivos no tienen ninguna protección especial y se pueden leer o se puede escribir en ellos en cualquier momento. Este valor corresponde a NSFileProtectionNone.

Importante: Los desarrolladores deben probar las aplicaciones empaquetadas que llevan a cabo procesos en segundo plano; por ejemplo, sincronizaciones en segundo plano o actualizaciones de contenido en un dispositivo bloqueado.

Esta directiva está oculta. Para que la directiva esté visible en XenMobile, abra el archivo policy_metadata.xml de la aplicación (en Applications/Citrix/MDXToolkit/data) y, en la sección MinimumDataProtectionClass, cambie el valor de PolicyHidden a false. Una vez empaquetada la aplicación, la directiva aparece al agregar la aplicación a XenMobile.

La experiencia de usuario:

  • Después de que un usuario actualice a una aplicación empaquetada con MDX Toolkit 10.2, cuando inicie la aplicación, MDX le pedirá que cree un código de acceso al dispositivo, si no existe ya. Luego MDX descifra los archivos existentes cifrados con MDX y usa el cifrado de archivos iOS para proteger los archivos.
  • Si los usuarios intentan abrir en iOS 9 aplicaciones empaquetadas con el MDX Toolkit 10.0.x, no podrán actualizar esas aplicaciones y tendrán que volver a instalar una versión de ellas empaquetada con el MDX Toolkit 10.2.

Comprobar la compatibilidad del cifrado de datos

Una de las funciones principales de MDX es que todos los datos persistente se cifran de forma transparente. No es necesario modificar la aplicación para obtener esta funcionalidad y, de hecho, no se puede evitar directamente. El administrador puede desactivar el cifrado de forma selectiva o completamente, pero la aplicación no tiene esa opción.

Este es uno de los puntos más densos de MDX y requiere que se entiendan los siguientes puntos:

  • El cifrado de archivos está presente para todo el código nativo que se ejecuta en los procesos administrados.

    La implementación del cifrado de datos de archivo es compatible con todo el código nativo, no solo con el código para aplicaciones que usan las plataformas de Apple y runtime de Objective-C de Apple. Todo cifrado de archivos implementado solo dentro y únicamente para runtime de Objective-C se puede vulnerar fácilmente.

  • Algunas de las API de plataforma, como la clase AVPlayer, la clase UIWebView y QLPreviewController se implementan en realidad por procesos de servicio iOS en otro contexto de ejecución que el proceso de la aplicación administrada del usuario.

    Estos procesos de servicio no pueden descifrar los datos de archivos MDX cifrados, por lo que la aplicación administrada debe proporcionar una copia temporal no cifrada de los datos a esos procesos de servicio. La aplicación administrada elimina esa copia después de 5 segundos. Es importante tener en cuenta la limitación existente cuando se usan estas clases, porque se pierde control sobre la dispersión de los datos suministrados a esas clases debido a la implementación que realiza Apple de esas clases concretas.

  • La asignación de memoria es problemática para el cifrado de XenMobile, ya que se basa en interfaces de llamada del sistema para operaciones E/S en archivos que llaman a aplicaciones.

    Una vez que se asigna la memoria de un archivo, las solicitudes E/S del archivo se administran fuera del contexto de la aplicación de usuario, con lo que se omite el cifrado de XenMobile. Todas las llamadas POSIX mmap(2) que realiza una aplicación administrada se asignan como MAP_PRIVATE y MAP_ANON y no están asociadas a ninguna descripción de archivo. Se intentan leer en todos los datos asignados durante la llamada mmap si se especifica una descripción de archivo fallida en todos los datos porque cualquier paginación subsiguiente de datos que realice el sistema operativo derivará en la lectura de datos cifrados sin que XenMobile los descifre. Esta técnica ha funcionado en todas las aplicaciones que se han probado con XenMobile, ya que la cantidad de datos de memoria asignada es pequeña, sin reclamos de páginas de memoria que tengan lugar en la aplicación.

  • El cifrado agrega un consumo notorio de los recursos. Los desarrolladores deben optimizar las operaciones E/S de los archivos para evitar la degradación del rendimiento. Por ejemplo, si lee y escribe repetidamente la misma información, puede que le interese implementar una caché a nivel de aplicación.

  • XenMobile solo cifra instancias de la libsqlite.dylib de Apple. Si la aplicación incorpora y/o enlaza directamente con una versión privada de libsqlite.dylib, XenMobile no cifrará las instancias de bases de datos de esa biblioteca privada.

  • XenMobile cifra las bases de datos SQLite de Apple con la capa de sistema de archivos virtuales de SQLite.

    El rendimiento puede ser un problema. El tamaño de la memoria caché estándar para base de datos es de 2000 páginas u 8 megabytes. Si la base de datos es grande, puede que un desarrollador deba especificar a la pragma SQLite que aumente el tamaño de la caché de base de datos. En Objective-C Core Data Framework, la pragma SQLite puede agregarse como un diccionario de opciones cuando se agregue el objeto Persistent Store al objeto Persistent Store Controller.

  • No se admite el modo SQLite WAL, ya que la biblioteca se vuelve a vincular al interfaces E/S de archivo y usa internamente una amplia asignación de memoria.

  • iOS implementa NSURLCache DiskCache con una base de datos SQLite. XenMobile inhabilita la caché de disco asociada, ya que son los procesos de servicio iOS no administrados los que remiten a esta base de datos.

  • En la siguiente tabla se ofrece una lista de los patrones de nombre de ruta de archivo excluidos y no modificables:

       
    .plist Se excluye debido al acceso que realizan los procesos del sistema iOS fuera del contexto de proceso.
    .app Subcadena antigua en el nombre del paquete de aplicación. Esta subcadena quedará obsoleta debido a que ahora se excluye una ruta de paquete de aplicación explícita.
    .db Un archivo con este sufijo no se cifra si no es una base de datos SQLite.
    /System/Library No se pueden cifrar las rutas de archivo que existan dentro del directorio del sandbox del paquete de aplicación ni las rutas de archivo fuera del sandbox de datos de aplicación. En iOS, la aplicación instalada es de solo lectura y se encuentra en otro directorio que los archivos de datos que haya generado la aplicación y que almacena cuando se ejecuta.
    Library/Preferences iOS accede directamente a los archivos. Por lo general, solo los archivos .plist están presentes en esta ruta del directorio.
    /com.apple.opengl/ iOS accede directamente a los archivos.
    csdk.db Base de datos Citrix SSLSDK SQLite antigua
    /Library/csdk.sql Base de datos Citrix SSLSDK SQLite
    CtxLog_ Prefijo del nombre de archivo de registro Citrix
    CitrixMAM.config Nombre de archivo interno de MDX
    CitrixMAM.traceLog Nombre antiguo de archivo interno de MDX
    CtxMAM.log Nombre de archivo interno de MDX
    data.999 Nombre de archivo interno de MDX
    CTXWrapperPersistentData Nombre de archivo interno de MDX
    /Documents/CitrixLogs Directorio de registros MDX
    /Document/CitrixLogs.zip Nombre de directorio de registros MDX comprimido
    Todos los archivos en la ruta del directorio del paquete de aplicación Directorio de archivos de aplicación de solo lectura
  • XenMobile sustituye una instancia de la clase privada SecureViewController de XenMobile por instancias de la clase de objeto QLPreviewController de Objective-C de Apple en ejecución. La clase SecureViewController de XenMobile deriva de la clase de objeto UIWebView de Objective-C de Apple. La clase de objeto QLPreviewController admite originalmente algunos formatos de archivo que la clase de objeto UIWebView no admite originalmente (por ejemplo, archivos de sonido y PDF).

  • Para un rendimiento óptimo, las solicitudes de E/S de archivos deben emitirse para desplazamientos de archivos múltiplos de 4096 bytes, y deben emitirse durante un periodo que también es un múltiplo de 4096 bytes.

  • El cifrado de XenMobile no admite la marca de modo de archivo O_NONBLOCK. Esta marca de modo de archivo se elimina de la lista de modos cuando XenMobile los procesa.

Entropía de usuario en el cifrado

Una opción de XenMobile para el cifrado requiere que el usuario final introduzca un PIN para que se genere la clave de cifrado. Esta opción se denomina entropía de usuario. Pueden causar un problema relevante para las aplicaciones.

En concreto, no se puede acceder a ningún archivo o base de datos hasta que el usuario introduzca el PIN. Si hay una operación de E/S para acceder a ellos en una ubicación que se ejecuta antes de que aparezca la solicitud del PIN, esa operación siempre fallará.

Para que este problema no se dé en la aplicación, realice pruebas con la entropía de usuario habilitada. La propiedad de cliente de XenMobile llamada “Encrypt secrets using Passcode” agrega la entropía de usuario. Configure dicha propiedad de cliente, que se encuentra inhabilitada de forma predeterminada. Para ello, desde la consola de XenMobile, vaya a Configurar > Parámetros > Más > Propiedades de cliente.

Compatibilidad de contención de datos

  • Ningún controlador de vista remoto dispone de medidas de seguridad para la contención de datos (por ejemplo, no tienen cifrado de datos ni directivas que bloquean las operaciones de copiar, cortar, pegar) debido a que un controlador de vista remoto se ejecuta en un contexto de proceso diferente a la aplicación administrada por MDX.
  • La acción de copiado es la única que se admite desde UIResponder. No se admiten otras acciones, como cortar y eliminar.
  • AirDrop solo se intercepta a nivel de interfaz de usuario, no a un nivel inferior.
  • No se interceptan MFI ni Bluetooth.

Respaldo para iconos de archivos

El empaquetado MDX requiere la presencia de al menos un icono que se pueda usar como icono en el springboard o icono para la aplicación en sí. Los desarrolladores de aplicaciones pueden agregar sus iconos a Asset Catalog (catálogo de inventario). También pueden usar las claves CFBundleIcons o CFBundleIconFiles en Info.plist.

El MDX Toolkit elegirá el primer icono incluido en la lista de ubicaciones plist conocidas de Info.plist:

  • CFBundleIcons
  • CFBundlePrimaryIcon
  • CFBundleIconFiles
  • UINewsstandIcon
  • CFBundleDocumentTypes

Si no se encuentra ninguna de esas claves en Info.plist, el MDX Toolkit identificará uno de los siguientes iconos en la carpeta raíz del paquete de aplicación:

  • Icon.png
  • Icon-60@2x.png
  • Icon-72.png
  • Icon-76.png

Redes y micro VPN

Actualmente MDX solo administra las llamadas red que emite directamente una aplicación. La plataforma de Apple emite directamente algunas consultas DNS y, por lo tanto, MDX no las administra.

Se ofrecen varias opciones de directivas XenMobile a los administradores de red. La directiva “Acceso de red” impide, permite o redirige la actividad de red de la aplicación de este modo:

  • De forma predeterminada, la aplicación tiene completamente bloqueado el acceso a la red. Si la directiva “Acceso de red” se establece en Bloqueado, fallarán las API de red que utilice la aplicación. Como se dicta en la directriz anterior, debe poder gestionar correctamente dicho fallo.
  • Cuando la directiva “Acceso de red” se establece en Sin restricciones, todas las llamadas de red van directamente y no se canalizan.
  • Cuando la directiva “Acceso de red” se establece en Túnel a la red interna, todas las llamadas de red se canalizan a través de NetScaler Gateway. El túnel de esta directiva se controla con la directiva “Modo preferido de VPN”.

La directiva “Modo preferido de VPN” establece el modo inicial para las conexiones que dirigen el tráfico a la red interna:

  • Cuando la directiva “Modo preferido de VPN” se establece en Exploración segura, la URL de HTTP o HTTPS se reescribe. El modo “Exploración segura” solo puede dirigir el tráfico HTTP y HTTPS. El modo “Exploración segura” ofrece dos ventajas considerables: la autenticación PKINIT y el tipo de inicio de sesión Single Sign-On (SSO) para el tráfico HTTP y HTTPS. En Android, el modo “Exploración segura” no consume muchos recursos. Por lo tanto, es la opción preferida para operaciones del tipo exploración Web.
  • Cuando la directiva “Modo preferido de VPN” se establece en Túnel VPN completo, todo el tráfico proveniente de la aplicación administrada se canaliza a través de NetScaler Gateway.

Limitaciones:

  • No se admite WkWebView.
  • Los usuarios no pueden reproducir vídeos alojados en sitios Web internos en las aplicaciones iOS empaquetadas con MDX debido a que los vídeos se reproducen en un proceso de reproductor de medios, presente en el dispositivo, que no intercepta MDX.
  • No se admite la descarga en segundo plano NSURLSession (NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier).
  • El tráfico UDP se bloquea si la directiva “Acceso de red” se establece en Bloqueado. No se canaliza el tráfico UDP si la directiva “Acceso de red” se establece en Túnel a la red interna.
  • Las aplicaciones empaquetadas con MDX no pueden crear instancias de un servidor de socket que escucha las conexiones entrantes. Sin embargo, las aplicaciones empaquetadas con MDX pueden usar un socket de cliente para conectarse a un servidor.

Respaldo a la biblioteca de terceros

Las plataformas de algunas aplicaciones presentan problemas de compatibilidad con XenMobile:

  • Se admiten aplicaciones desarrolladas con el entorno de desarrollo multiplataforma Xamarin. Citrix no declara oficialmente su respaldo para otros entornos de desarrollo multiplataforma porque no dispone de suficientes pruebas y ejemplos de uso.
  • SQLCipher no funciona con cifrado porque usa la asignación de memoria. Una solución es no usar SQLCipher. Otra solución es excluir el archivo de base de datos del cifrado mediante una directiva de exclusiones de cifrado. Un administrador de XenMobile debe configurar la directiva desde la consola de XenMobile.
  • Las bibliotecas de terceros y las aplicaciones que se enlazan directamente a las bibliotecas de OpenSSL libcrypto.a y libssl.a pueden resultar en error de enlace debido a símbolos que faltan y errores de vinculación debido a varias definiciones de símbolos.
  • Las aplicaciones que requieren respaldo para el servicio de notificaciones Push de Apple tendrán que seguir los pasos específicos que requiere Apple.
  • XenMobile establece explícitamente la versión de la base de datos SQLite a 1 para inhabilitar el respaldo a archivos Write Ahead Logging (WAL) y a archivos de memoria asignada dentro de las bases de datos SQLite. Cualquier intento de acceder directamente a interfaces SQLite en la versión 2 o 3 provocarán un error.