Prácticas recomendadas para aplicaciones iOS

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

Marco del SDK de aplicaciones MDX y empaquetado

Si la aplicación utiliza el marco del SDK de aplicaciones MDX, debe usar la versión coincidente de MDX Toolkit para el empaquetado. 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 necesita empaquetar la aplicación, y así se evitará el uso de un MDX Toolkit de otra versión. Para obtener más información acerca del empaquetado de aplicaciones ISV, consulte Empaquetar aplicaciones móviles iOS.

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 MDX Toolkit. Además, debe crear un perfil de aprovisionamiento para cada ID de aplicación.

No bloquee el subproceso principal

No use ningún código de bloqueo al ejecutar procesos en el subproceso principal. Esta es una directriz de Apple, pero es incluso más importante cuando se trata de Citrix Endpoint Management. Algunas acciones pueden tardar más tiempo en una aplicación administrada o pueden incluso bloquear ejecuciones posteriores 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, 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

Compruebe los valores devueltos de todas las llamadas API y gestione las excepciones que puedan darse como un efecto secundario de una llamada API. Este gesto garantiza una recuperación de errores correcta o un cierre estable de la aplicación. Aunque se trate de una práctica recomendada común en la programación, es especialmente importante para las aplicaciones administradas.

Varias API que suelen funcionar fallan si las directivas de Citrix Endpoint Management 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 devuelve un valor nulo si las directivas de Citrix Endpoint Management bloquean la funcionalidad subyacente. Por eso, deben solucionarse según corresponda.

Clase de objeto: AVCaptureDevice

  • Nombre del selector: devicesWithMediaType:

Clase de objeto: MFMailComposeViewController

  • Nombre del selector: init:

Clase de objeto: MFMessageComposeViewController

  • Nombre del selector: initWithNibName:bundle:

Clase de objeto: NSFileManager

  • Nombre del selector: URLForUbiquityContainerIdentifier:

Clase de objeto: NSUbiquitousKeyValueStore

  • Nombre del selector: defaultStore:

Clase de objeto: PHPhotoLibrary

  • Nombre del selector: sharedPhotoLibrary:

Clase de objeto: UIImagePickerController

  • Nombre del selector: availableCaptureModesForCameraDevice:

Clase de objeto: UIPasteboard

  • Nombre del selector:

    dataForPasteboardType:

    valueForPasteboardType:

    items:

    dataForPasteboardType:inItemSet:

    valuesForPasteboardType:inItemSet:

Clase de objeto: UIPopoverController

  • Nombre del selector: initWithContentViewController:

Clase de objeto: UINavigationController

  • Nombre del selector:

    ctxInitWithRootViewController:

    ctxPopToViewController:animated:

Redirija las interfaces en ejecución

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

Para garantizar la disponibilidad de Citrix Endpoint Management, le sugerimos que no redirija ni sustituya los selectores en tiempo de ejecución de Objective-C. El motivo es que Citrix Endpoint Management reordena los métodos subyacentes de varios selectores de clase de objeto para controlar o modificar el comportamiento en tiempo de ejecución de una aplicación. En la siguiente tabla se ofrece una lista de los selectores de clase Objective-C que Citrix Endpoint Management redirige:

Nombre de clase del objeto: NSURLProtectionSpace

  • Nombre del selector: serverTrust

Nombre de clase del objeto: NSURLAuthenticationChallenge

  • Nombre del selector: sender

Nombre de clase del objeto: NSURLConnection

  • Nombre del selector:

    sendSynchronousRequest:returningResponse:error:

    initWithRequest:delegate:startImmediately:

    initWithRequest:delegate:

    connectionWithRequest:delegate:

Nombre de clase del objeto: NSURLConnectionDelegate

  • Nombre del selector:

    connection:canAuthenticateAgainstProtectionSpace:

    connection:didReceiveAuthenticationChallenge:

    connection:willSendRequestForAuthenticationChallenge:

Nombre de clase del objeto: NSURLSessionConfiguration

  • Nombre del selector:

    defaultSessionConfiguration

    ephemeralSessionConfiguration

Nombre de clase del objeto: ALAssetsLibrary

  • Nombre del selector: authorizationStatus

Nombre de clase del objeto: AVAudioRecorder

  • Nombre del selector:

    record

    prepareToRecord

    recordForDuration:

    recordAtTime:

    recordAtTime:ForDuration:

Nombre de clase del objeto: AVAudioSession

  • Nombre del selector: recordPermission

Nombre de clase del objeto: AVCaptureDevice

  • Nombre del selector:

    devices

    devicesWithMediaType:

Nombre de clase del objeto: AVAsset

  • Nombre del selector: assetWithURL:

Nombre de clase del objeto: AVURLAsset

  • Nombre del selector:

    initWithURL:options:

    URLAssetWithURL:options:

Nombre de clase del objeto: AVPlayerItem

  • Nombre del selector:

    playerItemWithAsset:

    initWithURL:

    playerItemWithURL:

Nombre de clase del objeto: AVPlayer

  • Nombre del selector:

    playerWithPlayerItem:

    initWithPlayerItem:

    initWithURL:

Nombre de clase del objeto: CLLocationManager

  • Nombre del selector: startUpdatingLocation

Nombre de clase del objeto: UIScrollView

  • Nombre del selector: setContentOffset:

Nombre de clase del objeto: MFMailComposeViewController

  • Nombre del selector:

    canSendMail

    init

Nombre de clase del objeto: MFMessageComposeViewController

  • Nombre del selector:

    canSendText

    initWithNibName:bundle:

Nombre de clase del objeto: NSFileManager

  • Nombre del selector: URLForUbiquityContainerIdentifier:

Nombre de clase del objeto: NSUbiquitousKeyValueStore

  • Nombre del selector: defaultStore

Nombre de clase del objeto: PHPhotoLibrary

  • Nombre del selector: authorizationStatus

Nombre de clase del objeto: QLPreviewController

  • Nombre del selector:

    setDataSource:

    canPreviewItem:

Nombre de clase del objeto: QLPreviewControllerDataSource

  • Nombre del selector:

    numberOfPreviewItemsInPreviewController:

    previewController:previewItemAtIndex:

Nombre de clase del objeto: SLComposeViewController

  • Nombre del selector: isAvailableForServiceType:

Nombre de clase del objeto: UIActivityViewController

  • Nombre del selector:

    initWithActivityItems:applicationActivities:

    setExcludedActivityTypes:

Nombre de clase del objeto: UIApplication

  • Nombre del selector:

    openURL:

    canOpenURL:

    setApplicationIconBadgeNumber:

Nombre de clase del objeto: UIDocument

  • Nombre del selector:

    closeWithCompletionHandler:

    contentsForType:error:

Nombre de clase del objeto: UIDocumentInteractionController

  • Nombre del selector:

    interactionControllerWithURL:

    setURL:

    setDelegate:

    presentPreviewAnimated:

    presentOpenInMenuFromBarButtonItem:animated:

    presentOpenInMenuFromRect:inView:animated:

    presentOptionsMenuFromBarButtonItem:animated:

    presentOptionsMenuFromRect:inView:animated:

Nombre de clase del objeto: UIDocumentMenuViewController

  • Nombre del selector: initWithDocumentTypes:inMode:

Nombre de clase del objeto: UIImage

  • Nombre del selector: imageNamed:

Nombre de clase del objeto: UIImagePickerController

  • Nombre del selector: setSourceType:

    takePicture

    startVideoCapture

    isSourceTypeAvailable:

    isCameraDeviceAvailable:

    isFlashAvailableForCameraDevice:

    availableCaptureModesForCameraDevice:

    setMediaTypes

Nombre de clase del objeto: UINavigationController

  • Nombre del selector:

    ctxInitWithRootViewController:

    ctxPushViewController:animated:

    ctxPopToViewController:animated:

Nombre de clase del objeto: UIPasteboard

  • Nombre del selector:

    generalPasteboard

    pasteboardWithName:create:

    pasteboardWithUniqueName

    setValue:forPasteboardType:

    setData:forPasteboardType:

    setItems:

    addItems:

    dataForPasteboardType:

    valueForPasteboardType:

    numberOfItems

    pasteboardTypes

    pasteboardTypesForItemSet:

    containsPasteboardTypes:

    containsPasteboardTypes:inItemSet:

    items

    itemSetWithPasteboardTypes:

    dataForPasteboardType:inItemSet:

    valuesForPasteboardType:inItemSet:

    cadena

    strings

    URL

    URLs

    imagen

    images

    color

    colors

Nombre de clase del objeto: UIPopoverController

  • Nombre del selector: initWithContentViewController

Nombre de clase del objeto: UIPrintInteractionController

  • Nombre del selector:

    isPrintingAvailable

    presentAnimated:completionHandler:

    presentFromBarButtonItem:animated:completionHandler:

    presentFromRect:inView:animated:completionHandler:

Nombre de clase del objeto: UIViewController

  • Nombre del selector: presentViewController:animated:completion:

Nombre de clase del objeto: UIWebView

  • Nombre del selector:

    loadRequest:

    setDelegate:

    UIWebViewDelegate

    webView:shouldStartLoadWithRequest:navigationType:

    webViewDidStartLoad:

    webViewDidFinishLoad:

    webView:didFailLoadWithError:

Nombre de clase del objeto: UIWindow

  • Nombre del selector: makeKeyAndVisible

Nombre de clase del objeto: UIApplicationDelegate

  • Nombre del selector:

    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:

Nombre de clase del objeto: QLPreviewController

  • Nombre del selector: allocWithZone:

Comprobar la compatibilidad del cifrado de datos

Una de las funciones principales de MDX es que todos los datos que se conservan 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 de Citrix Endpoint Management 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 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 datos de archivos cifrados MDX. Por lo tanto, la aplicación administrada debe proporcionar al proceso de servicio una copia temporal sin cifrar de los datos. La aplicación administrada elimina la copia 5 segundos después. Es importante ser consciente de esta limitación al usar estas clases. El motivo es que se pierde el control sobre la contención de los datos suministrados a estas clases debido a la implementación que realiza Apple de las clases concretas.

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

    Después de asignar 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 Citrix Endpoint Management. 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 deriva en la lectura de datos cifrados sin que Citrix Endpoint Management los descifre. Esta técnica ha funcionado en todas las aplicaciones que se han probado con Citrix Endpoint Management, 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.

  • Citrix Endpoint Management 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, Citrix Endpoint Management no cifra las instancias de bases de datos de esa biblioteca privada.

  • Citrix Endpoint Management 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 a interfaces E/S de archivo y usa internamente una amplia asignación de memoria.

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

  • A continuación hay 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 queda obsoleta porque 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.
    • /Sistema/Librería: 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.
    • Librería/Preferencias: 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 MDX
    • CitrixMAM.traceLog: Antiguo nombre de archivo interno MDX
    • CtxMAM.log: Nombre de archivo interno de MDX
    • data.999: Nombre de archivo interno de MDX
    • CTXWrapperPersistentData: Nombre de archivo interno MDX
    • /Documents/CitrixLogs: Directorio de registros MDX
    • /Document/CitrixLogs.zip: Nombre del directorio de registros MDX comprimido
    • Cualquier archivo en la ruta del directorio del paquete de la aplicación: Directorio de solo lectura de archivos de la aplicación
  • Citrix Endpoint Management sustituye una instancia de la clase privada SecureViewController de Citrix Endpoint Management por instancias de la clase de objeto QLPreviewController de Objective-C de Apple en ejecución. La clase SecureViewController de Citrix Endpoint Management 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 Citrix Endpoint Management no admite la marca de modo de archivo O_NONBLOCK. Esta marca de modo de archivo se elimina de la lista de modos cuando Citrix Endpoint Management los procesa.

Entropía de usuario en el cifrado

Una opción de Citrix Endpoint Management 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. En Citrix Endpoint Management, la propiedad de cliente 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 Citrix Endpoint Management, 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.

Soporte para iconos de archivos

El empaquetado MDX requiere la presencia de al menos un icono que se pueda usar como icono de la pantalla de inicio o como icono de 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.

MDX Toolkit elige 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, 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 Citrix Endpoint Management a los administradores de red.

La directiva “Acceso de red” impide, permite o redirige la actividad de red de la aplicación.

Importante:

La versión 18.12.0 de MDX Toolkit incluía nuevas directivas que combinaban o reemplazaban directivas anteriores. La directiva Acceso de red combina las directivas: Acceso de red, Modo VPN preferido y Permite cambio de modo VPN. La directiva Lista de exclusión sustituye a Lista de exclusión de túnel dividido. La directiva “Sesión micro VPN requerida” reemplaza la “Sesión con conexión requerida”. Para obtener información detallada, consulte Novedades en versiones anteriores.

SSO web en túnel es el nombre de Secure Browser en los parámetros. El comportamiento es el mismo.

Opciones disponibles:

  • Utilizar parámetros anteriores: Los valores predeterminados son los valores que había establecido en las directivas anteriores. Si cambia esta opción, no debería volver a Utilizar parámetros anteriores. Tenga en cuenta también que los cambios en las nuevas directivas no surtirán efecto hasta que el usuario actualice la aplicación a 18.12.0 o posterior.
  • Bloqueada: Las API de red utilizadas por la aplicación fallarán. Como se indica en la directriz anterior, debe poder gestionar correctamente dicho fallo.
  • Sin restricciones: Todas las llamadas de red se envían directamente, no por túnel.
  • Túnel - VPN completo: Todo el tráfico proveniente de los túneles de las aplicaciones administradas se envía a través de Citrix Gateway.
  • SSO web en túnel: Se reescribe la URL de HTTP/HTTPS. Esta opción solo permite el envío por túnel del tráfico HTTP y HTTPS. Una ventaja considerable de SSO web en túnel es 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, esta opción no consume muchos recursos. Por lo tanto, es la opción preferida para operaciones del tipo exploración web.
  • Túnel VPN completo y SSO web permiten cambiar automáticamente entre modos VPN según sea necesario. Si las solicitudes de red fallan debido a una solicitud de autenticación que no se puede gestionar en un modo de VPN específico, se vuelven a intentar en un modo alternativo.

Limitaciones

  • 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 envía el tráfico UDP por túnel si la directiva “Acceso de red” se establece en Túnel - VPN completo.
  • 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.

Soporte para bibliotecas de terceros

Las plataformas de algunas aplicaciones presentan problemas de compatibilidad con Citrix Endpoint Management:

  • Se admiten aplicaciones desarrolladas con el entorno de desarrollo multiplataforma Xamarin. Citrix no declara oficialmente soporte 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 Citrix Endpoint Management debe configurar la directiva desde la consola de Citrix Endpoint Management.
  • Las bibliotecas de terceros y las aplicaciones que se enlazan directamente a las bibliotecas de OpenSSL libcrypto.a y libssl.a pueden provocar un error de enlace por símbolos que faltan y errores de vinculación por varias definiciones de símbolos.
  • Las aplicaciones que necesitan ser compatibles con el servicio de notificaciones Push de Apple tienen que seguir los pasos específicos que requiere Apple.
  • Citrix Endpoint Management establece explícitamente la versión de la base de datos SQLite a 1 para inhabilitar el uso de 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 de SQLite en la versión 2 o 3 provoca un error.