Recommandations pour les applications iOS

Lors du développement d’applications iOS, utilisez ces recommandations pour améliorer la compatibilité entre Citrix Endpoint Management et les applications mobiles pour appareils iOS.

Infrastructure du SDK de l’application MDX et encapsulation

Si votre application utilise l’infrastructure du SDK de l’application MDX, vous devez utiliser la version de l’outil MDX Toolkit correspondante pour l’encapsulation. Une différence de version entre ces deux composants peut entraîner un fonctionnement incorrect.

Pour éviter ce type d’incohérence, encapsulez l’application en tant qu’application ISV et spécifiez un mode d’application Premium ou General. Cette configuration vous permet de mettre à disposition une application préencapsulée. Par conséquent, le client n’a pas besoin d’encapsuler l’application, ce qui évite l’utilisation d’un MDX Toolkit de version différente. Pour de plus amples informations sur l’encapsulation ISV, consultez la section Encapsulation d’applications mobiles iOS.

Utiliser des ID d’application explicites

Si votre compte iOS Developer Enterprise ne prend pas en charge les ID d’application génériques, vous devez créer un ID d’application explicite pour chaque application que vous voulez encapsuler avec le MDX Toolkit. Vous devez également créer un profil de provisioning pour chaque ID d’application.

Ne pas bloquer le thread principal

N’utilisez pas de code de blocage lors de l’exécution sur le thread principal. Il s’agit d’une recommandation Apple, mais elle est encore plus importante avec Citrix Endpoint Management. Certaines actions peuvent prendre plus de temps dans une application gérée ou bloquer l’exécution d’autres threads. Les opérations de fichier, de base de données et de réseau sont des exemples d’opérations qui peuvent bloquer le thread en cours d’exécution et doivent être évitées sur le thread principal.

Écrire un code robuste

En particulier, vous devriez écrire des applications en suivant les recommandations indiquées dans les guides de programmation d’Apple, tels que le Guide de programmation d’applications Apple.

Utiliser uniquement des interfaces publiées par Apple

Vérifiez les valeurs renvoyées pour tous les appels d’API et gérez les exceptions qui peuvent être provoquées par l’appel d’API. Cela permet de garantir une récupération normale après erreur ou la fermeture normale de l’application. Bien que ce soit une recommandation courante en programmation, elle est particulièrement importante pour les applications gérées.

Plusieurs API qui fonctionnent généralement sans problème échouent si la fonctionnalité sous-jacente a été bloquée en raison de stratégies Citrix Endpoint Management. Les fonctionnalités décrites précédemment en sont des exemples :

  • Les API de réseau échouent comme s’il n’existait aucun réseau disponible.
  • Les API de détection, telles que le GPS et l’appareil photo, renvoient une valeur null ou une exception.

Les sélecteurs d’exécution Objective-C suivants renvoient une valeur null si la fonctionnalité sous-jacente a été bloquée en raison de stratégies Citrix Endpoint Management et doivent être traités en conséquence.

Classe d’objet : AVCaptureDevice

  • Nom du sélecteur : devicesWithMediaType:

Classe d’objet : MFMailComposeViewController

  • Nom du sélecteur : init:

Classe d’objet : MFMessageComposeViewController

  • Nom du sélecteur : initWithNibName:bundle:

Classe d’objet : NSFileManager

  • Nom du sélecteur : URLForUbiquityContainerIdentifier:

Classe d’objet : NSUbiquitousKeyValueStore

  • Nom du sélecteur : defaultStore:

Classe d’objet : PHPhotoLibrary

  • Nom du sélecteur : sharedPhotoLibrary:

Classe d’objet : UIImagePickerController

  • Nom du sélecteur : availableCaptureModesForCameraDevice:

Classe d’objet : UIPasteboard

  • Nom du sélecteur :

    dataForPasteboardType:

    valueForPasteboardType:

    items:

    dataForPasteboardType:inItemSet:

    valuesForPasteboardType:inItemSet:

Classe d’objet : UIPopoverController

  • Nom du sélecteur : initWithContentViewController :

Classe d’objet : UINavigationController

  • Nom du sélecteur :

    ctxInitWithRootViewController:

    ctxPopToViewController:animated:

Rediriger les interfaces d’exécution

Citrix Endpoint Management propose une invite à entrer le code PIN de sorte que vous n’avez pas besoin de le faire dans votre application.

Pour assurer la disponibilité de Citrix Endpoint Management, il est recommandé de ne pas rediriger ou remplacer les sélecteurs d’exécution Objective-C. En effet, Citrix Endpoint Management mélange les méthodes sous-jacentes de plusieurs sélecteurs de classes d’objet pour contrôler ou modifier le comportement d’exécution d’une application. Le tableau suivant dresse la liste des sélecteurs de classes Objective-C que Citrix Endpoint Management redirige :

Nom de la classe d’objet : NSURLProtectionSpace

  • Nom du sélecteur : serverTrust

Nom de la classe d’objet : NSURLAuthenticationChallenge

  • Nom du sélecteur : sender

Nom de la classe d’objet : NSURLConnection

  • Nom du sélecteur :

    sendSynchronousRequest:returningResponse:error:

    initWithRequest:delegate:startImmediately:

    initWithRequest:delegate:

    connectionWithRequest:delegate:

Nom de la classe d’objet : NSURLConnectionDelegate

  • Nom du sélecteur :

    connection:canAuthenticateAgainstProtectionSpace:

    connection:didReceiveAuthenticationChallenge:

    connection:willSendRequestForAuthenticationChallenge:

Nom de la classe d’objet : NSURLSessionConfiguration

  • Nom du sélecteur :

    defaultSessionConfiguration

    ephemeralSessionConfiguration

Nom de la classe d’objet : ALAssetsLibrary

  • Nom du sélecteur : authorizationStatus

Nom de la classe d’objet : AVAudioRecorder

  • Nom du sélecteur :

    record

    prepareToRecord

    recordForDuration:

    recordAtTime:

    recordAtTime:ForDuration:

Nom de la classe d’objet : AVAudioSession

  • Nom du sélecteur : recordPermission

Nom de la classe d’objet : AVCaptureDevice

  • Nom du sélecteur :

    devices

    devicesWithMediaType:

Nom de la classe d’objet : AVAsset

  • Nom du sélecteur : assetWithURL:

Nom de la classe d’objet : AVURLAsset

  • Nom du sélecteur :

    initWithURL:options:

    URLAssetWithURL:options:

Nom de la classe d’objet : AVPlayerItem

  • Nom du sélecteur :

    playerItemWithAsset:

    initWithURL:

    playerItemWithURL:

Nom de la classe d’objet : AVPlayer

  • Nom du sélecteur :

    playerWithPlayerItem:

    initWithPlayerItem:

    initWithURL:

Nom de la classe d’objet : CLLocationManager

  • Nom du sélecteur : startUpdatingLocation

Nom de la classe d’objet : UIScrollView

  • Nom du sélecteur : setContentOffset:

Nom de la classe d’objet : MFMailComposeViewController

  • Nom du sélecteur :

    canSendMail

    init

Nom de la classe d’objet : MFMessageComposeViewController

  • Nom du sélecteur :

    canSendText

    initWithNibName:bundle:

Nom de la classe d’objet : NSFileManager

  • Nom du sélecteur : URLForUbiquityContainerIdentifier:

Nom de la classe d’objet : NSUbiquitousKeyValueStore

  • Nom du sélecteur : defaultStore

Nom de la classe d’objet : PHPhotoLibrary

  • Nom du sélecteur : authorizationStatus

Nom de la classe d’objet : QLPreviewController

  • Nom du sélecteur :

    setDataSource:

    canPreviewItem:

Nom de la classe d’objet : QLPreviewControllerDataSource

  • Nom du sélecteur :

    numberOfPreviewItemsInPreviewController:

    previewController:previewItemAtIndex:

Nom de la classe d’objet : SLComposeViewController

  • Nom du sélecteur : isAvailableForServiceType:

Nom de la classe d’objet : UIActivityViewController

  • Nom du sélecteur :

    initWithActivityItems:applicationActivities:

    setExcludedActivityTypes:

Nom de la classe d’objet : UIApplication

  • Nom du sélecteur :

    openURL:

    canOpenURL:

    setApplicationIconBadgeNumber:

Nom de la classe d’objet : UIDocument

  • Nom du sélecteur :

    closeWithCompletionHandler:

    contentsForType:error:

Nom de la classe d’objet : UIDocumentInterActionController

  • Nom du sélecteur :

    interactionControllerWithURL:

    setURL:

    setDelegate:

    presentPreviewAnimated:

    presentOpenInMenuFromBarButtonItem:animated:

    presentOpenInMenuFromRect:inView:animated:

    presentOptionsMenuFromBarButtonItem:animated:

    presentOptionsMenuFromRect:inView:animated:

Nom de la classe d’objet : UIDocumentMenuViewController

  • Nom du sélecteur : initWithDocumentTypes:inMode:

Nom de la classe d’objet : UIImage

  • Nom du sélecteur : imageNamed:

Nom de la classe d’objet : UIImagePickerController

  • Nom du sélecteur : setSourceType:

    takePicture

    startVideoCapture

    isSourceTypeAvailable:

    isCameraDeviceAvailable:

    isFlashAvailableForCameraDevice:

    availableCaptureModesForCameraDevice:

    setMediaTypes

Nom de la classe d’objet : UINavigationController

  • Nom du sélecteur :

    ctxInitWithRootViewController:

    ctxPushViewController:animated:

    ctxPopToViewController:animated:

Nom de la classe d’objet : UIPasteboard

  • Nom du sélecteur :

    generalPasteboard

    pasteboardWithName:create:

    pasteboardWithUniqueName

    setValue:forPasteboardType:

    setData:forPasteboardType:

    setItems:

    addItems:

    dataForPasteboardType:

    valueForPasteboardType:

    numberOfItems

    pasteboardTypes

    pasteboardTypesForItemSet:

    containsPasteboardTypes:

    containsPasteboardTypes:inItemSet:

    items

    itemSetWithPasteboardTypes:

    dataForPasteboardType:inItemSet:

    valuesForPasteboardType:inItemSet:

    string

    strings

    URL

    URL

    Image

    images

    color

    colors

Nom de la classe d’objet : UIPopoverController

  • Nom du sélecteur : initWithContentViewController

Nom de la classe d’objet : UIPrintInteractionController

  • Nom du sélecteur :

    isPrintingAvailable

    presentAnimated:completionHandler:

    presentFromBarButtonItem:animated:completionHandler:

    presentFromRect:inView:animated:completionHandler:

Nom de la classe d’objet : UIViewController

  • Nom du sélecteur : presentViewController:animated:completion:

Nom de la classe d’objet : UIWebView

  • Nom du sélecteur :

    loadRequest:

    setDelegate:

    UIWebViewDelegate

    webView:shouldStartLoadWithRequest:navigationType:

    webViewDidStartLoad:

    webViewDidFinishLoad:

    webView:didFailLoadWithError:

Nom de la classe d’objet : UIWindow

  • Nom du sélecteur : makeKeyAndVisible

Nom de la classe d’objet : UIApplicationDelegate

  • Nom du sélecteur :

    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:

Nom de la classe d’objet : QLPreviewController

  • Nom du sélecteur : allocWithZone:

Assurer la compatibilité du cryptage de données

L’une des fonctionnalités principales de MDX est que toutes les données conservées sont cryptées de façon transparente. Vous n’avez pas besoin de modifier votre application pour bénéficier de cette fonctionnalité, et en fait, vous ne pouvez pas directement l’éviter. L’administrateur Citrix Endpoint Management peut désactiver le cryptage de manière sélective ou complètement, mais pas l’application.

Ceci est l’un des aspects plus complexes de MDX et il est important de comprendre les points suivants :

  • Le cryptage de fichier est présent pour l’ensemble du code natif qui s’exécute dans les processus gérés.

    La mise en œuvre du cryptage des données de fichier concerne l’ensemble du code natif et pas seulement le code des applications utilisant les infrastructures Apple et l’exécution d’Apple Objective-C. Tout cryptage de données de fichier mis en œuvre dans et uniquement pour l’exécution d’Objective-C peut être facilement détourné.

  • Certaines API d’infrastructure, telles que la classe AVPlayer, la classe UIWebView et QLPreviewController, sont mises en œuvre par les processus de service iOS dans un contexte d’exécution différent du processus d’application gérée de l’utilisateur.

    Ces processus de service ne peuvent pas décrypter les données de fichier cryptées par MDX. Par conséquent, l’application gérée doit fournir le processus de service avec une copie temporaire non cryptée des données. Cette copie est ensuite supprimée par l’application gérée au bout de 5 secondes. Il est important que vous connaissiez cette limitation si vous utilisez ces classes car nous perdons le contrôle de la contention des données fournies à ces classes à cause de la mise en œuvre par Apple de ces classes spécifiques.

  • Le mappage de mémoire est problématique pour le cryptage Citrix Endpoint Management car il implique l’appel par l’application des interfaces d’appel du système E/S du fichier.

    Une fois qu’un fichier est mappé en mémoire, les requêtes E/S pour le fichier sont gérées en dehors du contexte de l’application utilisateur, ignorant le cryptage de Citrix Endpoint Management. Tous les appels mmap(2) POSIX par une application gérée sont mappés comme MAP_PRIVATE et MAP_ANON et ne sont pas associés à une description de fichier. Une tentative de lecture de toutes les données mappées lors de l’appel mmap échoue pour toutes les données si une description de fichier est spécifiée. En effet, toute pagination suivante des données par le système d’exploitation entraîne la lecture des données cryptées sans qu’elles soient décryptées par Citrix Endpoint Management. Cette technique a réussi dans toutes les applications qui ont été testées avec Citrix Endpoint Management car le volume de données qui est mappé en mémoire est faible sans récupération des pages mémoire dans l’application.

  • Le cryptage ajoute une charge significative. Les développeurs devraient optimiser le traitement E/S disque pour empêcher la dégradation des performances. Par exemple, si vous lisez et écrivez de manière répétée les mêmes informations, il se peut que vous souhaitiez mettre en place un cache au niveau de l’application.

  • Citrix Endpoint Management crypte uniquement les instances de la libsqlite.dylib d’Apple. Si l’application établit un lien direct et/ou incorpore une version privée de la libsqlite.dylib, les instances de bases de données de cette bibliothèque privée ne sont pas cryptées par Citrix Endpoint Management.

  • Les bases de données Apple SQLite sont cryptées par Citrix Endpoint Management à l’aide de la couche VFS de SQLite.

    Vous pouvez rencontrer un problème de performance. La taille du cache de base de données standard est 2 000 pages ou 8 Mo. Si votre base de données est volumineuse, il peut être nécessaire qu’un développeur spécifie une commande pragma SQLite pour augmenter la taille du cache de la base de données. Dans Objective-C Core Data Framework, la commande pragma SQLite peut être ajoutée en tant que dictionnaire d’options lors de l’ajout de l’objet Persistent Store à l’objet Persistent Store Controller.

  • Le mode SQLite WAL n’est pas pris en charge car la bibliothèque est de nouveau liée aux interfaces E/S de fichier et en interne utilise le mappage de mémoire de façon extensive.

  • NSURLCache DiskCache est mis en œuvre par iOS à l’aide d’une base de données SQLite. Citrix Endpoint Management désactive le cache disque associé, car cette base de données est référencée par des processus de service iOS non gérés.

  • Vous trouverez ci-après une liste des modèles de nom de chemin d’accès de fichier exclus codés en dur :

    • .plist : exclu en raison d’un accès par les processus système iOS en dehors du contexte de processus.
    • .app : sous-chaîne d’ancienne génération dans le nom du bundle de l’application. Cette sous-chaîne est obsolète, car un chemin d’accès de bundle d’application explicite est désormais exclu.
    • .db : un fichier avec ce suffixe n’est pas crypté si le fichier n’est pas une base de données SQLite.
    • /System/Library : les chemins d’accès aux fichiers dans le répertoire sandbox du bundle d’application et les chemins d’accès aux fichiers en dehors du sandbox des données d’application ne peuvent pas être cryptés. Sur iOS, l’application installée est en lecture seule et se trouve dans un répertoire différent de celui des fichiers de données de l’application que l’application produit et stocke lorsqu’elle est exécutée.
    • Library/Preferences : les fichiers sont accessibles directement par iOS. Normalement, seuls les fichiers .plist sont présents dans ce répertoire.
    • /com.apple.opengl/ : iOS accède directement aux fichiers.
    • csdk.db : base de données Citrix SSLSDK SQLite ancienne version
    • /Library/csdk.sql : base de données Citrix SSLSDK SQLite
    • CtxLog_ : préfixe du nom du fichier journal Citrix
    • CitrixMAM.config : nom de fichier interne MDX
    • Citrixmam.tracelog : nom de fichier interne MDX hérité
    • CtxMAM.log : nom de fichier interne MDX
    • data.999 : nom de fichier interne MDX
    • CTXWrapperPersistentData : nom de fichier interne MDX
    • /Documents/CitrixLogs : répertoire des journaux MDX
    • /Document/CitrixLogs.zip : nom du répertoire du journal MDX compressé
    • Tout fichier dans le chemin d’accès au répertoire du bundle d’application : répertoire en lecture seule des fichiers de l’application
  • Citrix Endpoint Management remplace une instance de la classe Citrix Endpoint Management SecureViewController privée par des instances de la classe d’objet Apple Objective-C QLPreviewController au moment de l’exécution. La classe Citrix Endpoint Management SecureViewController est dérivée de la classe d’objet Apple Objective-C UIWebView. La classe d’objet QLPreviewController prend en charge en mode natif quelques formats de fichier que la classe d’objet UIWebView ne prend pas en charge en mode natif, tels que les types audio et PDF.

  • Pour obtenir les meilleures performances, les requêtes E/S de fichier doivent être émises à des offsets de fichier qui sont un multiple de 4 096 octets et doivent être émises pour une longueur qui est également un multiple de 4 096 octets.

  • L’indicateur de mode de fichier O_NONBLOCK n’est pas pris en charge par le cryptage Citrix Endpoint Management. Cet indicateur est supprimé de la liste des modes lors du traitement par Citrix Endpoint Management.

Entropie utilisateur

Une option de cryptage Citrix Endpoint Management nécessite que l’utilisateur entre un code PIN avant que la clé de cryptage puisse être générée. Cette option est appelée entropie utilisateur. Elle peut entraîner un problème particulier pour les applications.

Plus spécifiquement, aucun accès fichier ou base de données ne peut être effectué jusqu’à ce que l’utilisateur entre un code PIN. Si une telle opération E/S est présente à un emplacement qui s’exécute avant que l’interface utilisateur du code PIN puisse être affichée, elle échouera toujours.

Pour vous assurer que ce problème ne concerne pas votre application, testez-la avec l’entropie utilisateur activée. La propriété du client Citrix Endpoint Management, Encrypt secrets using Passcode, ajoute l’entropie utilisateur. Vous pouvez configurer cette propriété de client, qui est désactivée par défaut, dans la console Citrix Endpoint Management, sous Configurer > Paramètres > Plus > Propriétés du client.

Compatibilité de la contention des données

  • Les contrôleurs d’affichage à distance n’ont pas de contention de sécurité (par exemple, le cryptage de données, le blocage de la stratégie copier/couper/coller, et ainsi de suite) car un contrôleur d’affichage à distance s’exécute dans un contexte de processus différent de l’application gérée par MDX.
  • L’action Copier est la seule action prise en charge depuis UIResponder. Les autres actions, telles que Couper et Supprimer, ne sont pas prises en charge.
  • AirDrop est intercepté uniquement au niveau de l’interface utilisateur, et non pas à un niveau inférieur.
  • MFI et Bluetooth ne sont pas interceptés.

Prise en charge des fichiers d’icônes

L’encapsulation MDX requiert la présence d’au moins une icône qui peut être utilisée comme icône d’écran d’accueil ou icône d’application. Les développeurs d’applications peuvent ajouter leurs icônes au catalogue de logiciels, ou utiliser les clés CFBundleIcons ou CFBundleIconFiles du fichier Info.plist.

Le MDX Toolkit choisit la première clé dans la liste des emplacements plist connus du fichier Info.plist :

  • CFBundleIcons
  • CFBundlePrimaryIcon
  • CFBundleIconFiles
  • UINewsstandIcon
  • CFBundleDocumentTypes

Si aucune de ces clés n’est trouvée dans Info.plist, le MDX Toolkit identifiera l’une des icônes suivantes dans le dossier racine du bundle d’application :

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

Réseau et micro VPN

MDX gère actuellement uniquement les appels réseau directement émis par une application. Certaines requêtes DNS sont émises directement par l’infrastructure Apple et ne sont donc pas gérées par MDX.

Les administrateurs disposent de plusieurs options de stratégie Citrix Endpoint Management pour le réseau.

La stratégie Accès réseau empêche, permet ou redirige l’activité réseau de l’application :

Important :

La version 18.12.0 de MDX Toolkit inclut de nouvelles stratégies combinant ou remplaçant des stratégies plus anciennes. La stratégie Accès réseau combine Accès réseau, Mode VPN préféré et Autoriser le basculement vers le mode VPN. La stratégie Liste d’exclusion remplace Liste d’exclusion de split tunneling. La stratégie Session micro VPN requise remplace Session en ligne requise. Pour plus de détails, consultez Nouveautés dans les versions précédentes.

Tunnel - SSO Web est le nom de Secure Browse dans les paramètres. Le comportement est le même.

Les options sont les suivantes :

  • Utiliser les paramètres précédents : utilise par défaut les valeurs que vous aviez définies dans les stratégies précédentes. Si vous modifiez cette option, vous ne devez pas revenir à Utiliser paramètres précédents. Notez également que les modifications apportées aux nouvelles stratégies ne prennent effet que lorsque l’utilisateur met à niveau l’application vers 18.12.0 ou version ultérieure.
  • Bloqué : les API de mise en réseau utilisées par votre application échoueront. Conformément à la recommandation précédente, vous devriez traiter un tel échec de façon appropriée.
  • Sans restriction : tous les appels réseau ont un accès direct et ne sont pas tunnélisés.
  • Tunnel VPN complet : tout le trafic provenant de l’application gérée est tunnélisé via Citrix Gateway.
  • Tunnel - SSO Web : l’URL HTTP/HTTPS est réécrite. Cette option permet uniquement le tunneling du trafic HTTP et HTTPS. Un avantage important de Tunnel - SSO Web est l’authentification unique (SSO) pour le trafic HTTP et HTTPS ainsi que l’authentification PKINIT. Sur Android, cette option a une charge de configuration faible et il s’agit donc de l’option préférée pour les opérations de type navigation Web.
  • Tunnel - VPN complet et SSO Web : permet de basculer automatiquement entre les modes VPN selon les besoins. Si une demande réseau qui a échoué en raison d’une demande d’authentification qui ne peut pas être traitée dans un mode VPN spécifique est de nouveau tentée dans un autre mode.

Limitations

  • Les utilisateurs ne peuvent pas lire de vidéos hébergées sur des sites Web internes dans les applications iOS MDX encapsulées car les vidéos sont lues dans un processus de lecteur multimédia sur l’appareil que MDX n’intercepte pas.
  • Le téléchargement en arrière-plan NSURLSession (NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier) n’est pas pris en charge.
  • Nous bloquons le trafic UDP si la stratégie Accès réseau est définie sur Bloqué. Nous ne tunnélisons pas le trafic UDP si la stratégie Accès réseau est définie sur Tunnel VPN complet.
  • Les applications encapsulées par MDX ne peuvent pas ajouter un serveur socket qui écoute les connexions entrantes. Toutefois, les applications encapsulées par MDX peuvent utiliser un socket client pour se connecter à un serveur.

Prise en charge des bibliothèques tierces

Certaines infrastructures d’applications ont des problèmes de compatibilité avec Citrix Endpoint Management.

  • Les applications développées avec l’environnement de développement multi-plateformes Xamarin sont prises en charge. Citrix ne déclare pas officiellement la prise en charge d’autres environnements de développement multi-plateformes en raison d’exemples insuffisants d’utilisation et de test.
  • SQLCipher ne fonctionne pas avec le cryptage car il utilise le mappage de mémoire. Une solution consiste à ne pas utiliser SQLCipher. Une autre solution consiste à exclure le fichier de base de données du cryptage à l’aide d’une stratégie d’exclusion de cryptage. Un administrateur Citrix Endpoint Management doit configurer la stratégie dans la console Citrix Endpoint Management.
  • Les bibliothèques d’applications et tierces qui lient directement aux bibliothèques OpenSSL libcrypto.a et libssl.a peuvent entraîner une erreur de lien en raison d’un manque de symboles et des erreurs de lien en raison de définitions de symbole multiples.
  • Les applications nécessitant une prise en charge du service de notification push d’Apple doivent suivre les étapes spécifiques requises par Apple.
  • Citrix Endpoint Management définit de manière explicite la version de la base de données SQLite sur 1 pour désactiver la prise en charge des fichiers WAL (Write Ahead Logging) et des fichiers mappés en mémoire dans les bases de données SQLite. Toute tentative d’accéder directement aux interfaces SQLite version 2 ou 3 échoue.