Bonnes pratiques pour les applications iOS
Lors du développement d’applications iOS, utilisez ces bonnes pratiques pour améliorer la compatibilité entre Citrix Endpoint Management™ et les applications mobiles pour appareils iOS.
Framework MDX App SDK et encapsulage
Si votre application utilise le framework MDX App SDK, vous devez utiliser la version correspondante du MDX Toolkit pour l’encapsulage. Une incompatibilité de version entre ces deux composants pourrait entraîner un fonctionnement incorrect.
Pour éviter une telle incompatibilité, encapsulez l’application en tant qu’application ISV et spécifiez un mode d’application Premium ou Général. Cela vous permet de livrer une application pré-encapsulée. Par conséquent, votre client n’a pas besoin d’encapsuler l’application, évitant ainsi l’utilisation d’un MDX Toolkit incompatible. Pour plus de détails sur l’encapsulage ISV, consultez Encapsulage des 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 (wildcard), assurez-vous de créer un ID d’application explicite pour chaque application que vous prévoyez d’encapsuler avec le MDX Toolkit. Créez également un profil d’approvisionnement pour chaque ID d’application.
-
Ne bloquez pas le thread principal
N’utilisez pas de code bloquant lors de l’exécution sur le thread principal. Il s’agit d’une directive d’Apple, mais elle est encore plus cruciale avec Citrix Endpoint Management. Certaines actions peuvent prendre plus de temps dans une application gérée ou bloquer l’exécution ultérieure du thread. Les opérations de fichier, de base de données et de réseau sont des exemples d’opérations qui pourraient bloquer le thread en cours d’exécution et devraient être évitées sur le thread principal.
-
Écrire du code robuste
-
En particulier, vous devez écrire des applications en suivant les bonnes pratiques documentées dans les guides de programmation d’Apple, tels que le Guide de programmation d’applications Apple.
-
Utiliser uniquement les interfaces publiées par Apple
-
Vérifiez les valeurs de retour de tous les appels d’API et gérez toutes les exceptions pouvant survenir en tant qu’effet secondaire d’un appel d’API. Cet effort garantit une récupération d’erreur ou une terminaison de l’application en douceur. Bien qu’il s’agisse d’une bonne pratique de programmation courante, elle est particulièrement importante pour les applications gérées.
-
Diverses API que vous vous attendez à voir fonctionner échouent si la fonctionnalité sous-jacente a été bloquée en raison des politiques de Citrix Endpoint Management. Des exemples incluraient toutes les capacités décrites précédemment :
- Les API de mise en réseau échouent comme s’il n’y avait pas de réseau disponible.
- Les API de capteurs, telles que le GPS et l’appareil photo, renvoient null ou lèvent une exception.
Les sélecteurs d’exécution Objective-C suivants renvoient nil si la fonctionnalité sous-jacente a été bloquée en raison des politiques de Citrix Endpoint Management et doivent donc être géré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 fournit une interaction d’invite de code PIN d’interface utilisateur afin que vous n’ayez pas à le faire dans votre application.
Pour garantir la préparation de Citrix Endpoint Management, nous vous suggérons de ne pas rediriger ou substituer les sélecteurs d’exécution Objective-C. La raison en est que Citrix Endpoint Management “swizzle” les méthodes sous-jacentes de plusieurs sélecteurs de classe d’objet pour contrôler ou modifier le comportement d’exécution d’une application. Le tableau suivant répertorie les sélecteurs de classe 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’objets : AVAudioSession
-
Nom du sélecteur : recordPermission
-
Nom de la classe d’objets : AVCaptureDevice
-
Nom du sélecteur :
devices
devicesWithMediaType:
Nom de la classe d’objets : AVAsset
- Nom du sélecteur : assetWithURL:
Nom de la classe d’objets : AVURLAsset
-
Nom du sélecteur :
initWithURL:options:
URLAssetWithURL:options:
Nom de la classe d’objets : AVPlayerItem
-
Nom du sélecteur :
playerItemWithAsset:
initWithURL:
playerItemWithURL:
Nom de la classe d’objets : AVPlayer
-
Nom du sélecteur :
playerWithPlayerItem:
initWithPlayerItem:
initWithURL:
Nom de la classe d’objets : CLLocationManager
-
Nom du sélecteur : startUpdatingLocation
-
Nom de la classe d’objets : UIScrollView
-
Nom du sélecteur : setContentOffset:
Nom de la classe d’objets : MFMailComposeViewController
-
Nom du sélecteur :
-
canSendMail
init
Nom de la classe d’objets : MFMessageComposeViewController
-
Nom du sélecteur :
canSendText
initWithNibName:bundle:
Nom de la classe d’objets : NSFileManager
- Nom du sélecteur : URLForUbiquityContainerIdentifier:
Nom de la classe d’objets : NSUbiquitousKeyValueStore
- Nom du sélecteur : defaultStore
Nom de la classe d’objets : PHPhotoLibrary
- Nom du sélecteur : authorizationStatus
Nom de la classe d’objets : QLPreviewController
-
Nom du sélecteur :
setDataSource:
canPreviewItem:
Nom de la classe d’objets : QLPreviewControllerDataSource
-
Nom du sélecteur :
numberOfPreviewItemsInPreviewController:
-
previewController:previewItemAtIndex:
-
Nom de la classe d’objets : SLComposeViewController
-
Nom du sélecteur : isAvailableForServiceType:
-
Nom de la classe d’objets : UIActivityViewController
-
Nom du sélecteur :
-
initWithActivityItems:applicationActivities:
-
setExcludedActivityTypes:
- Nom de la classe d’objets : UIApplication
-
Nom du sélecteur :
-
openURL:
-
canOpenURL:
-
setApplicationIconBadgeNumber:
-
Nom de la classe d’objets : UIDocument
-
Nom du sélecteur :
-
closeWithCompletionHandler:
-
contentsForType:error:
-
Nom de la classe d’objets : 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
URLs
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 chiffrement des données
L’une des principales fonctionnalités de MDX est que toutes les données persistantes sont chiffrées de manière transparente. Vous n’avez pas besoin de modifier votre application pour bénéficier de cette fonctionnalité et, en fait, vous ne pouvez pas l’éviter directement. L’administrateur Citrix Endpoint Management peut désactiver le chiffrement de manière sélective ou totale, mais pas l’application.
C’est l’un des aspects les plus lourds de MDX et il nécessite une compréhension des points suivants :
-
Le chiffrement des fichiers est présent pour tout le code natif qui s’exécute dans des processus gérés.
L’implémentation du chiffrement des données de fichiers prend en charge tout le code natif et pas seulement le code des applications utilisant les frameworks Apple et le runtime Apple Objective-C. Tout chiffrement des données de fichiers implémenté au sein et uniquement pour le runtime Objective-C peut être facilement subverti.
-
Certaines API de framework, telles que la classe AVPlayer, la classe UIWebView et QLPreviewController, sont implémentées par les processus de service iOS dans un contexte d’exécution différent de celui du processus d’application gérée de l’utilisateur.
Ces processus de service ne peuvent pas déchiffrer les données de fichiers chiffrées par MDX. Par conséquent, l’application gérée doit fournir au processus de service une copie temporaire non chiffrée des données. La copie est supprimée par l’application gérée après 5 secondes. Il est important que vous soyez conscient de cette limitation lors de l’utilisation de ces classes. La raison en est que nous perdons le contrôle de la conteneurisation des données fournies à ces classes en raison de l’implémentation par Apple de ces classes spécifiques.
-
Le mappage de mémoire est problématique pour le chiffrement Citrix Endpoint Management car il repose sur l’appel par l’application d’interfaces d’appels système d’E/S de fichiers.
Après le mappage d’un fichier en mémoire, les requêtes d’E/S pour le fichier sont gérées en dehors du contexte de l’application utilisateur, contournant ainsi le chiffrement Citrix Endpoint Management. Tous les appels POSIX mmap(2) effectués par une application gérée sont mappés en tant que MAP_PRIVATE et MAP_ANON et ne sont associés à aucune description de fichier. Une tentative est faite de lire toutes les données mappées lors de l’appel mmap si une description de fichier est spécifiée pour charger toutes les données, car toute pagination ultérieure des données par le système d’exploitation entraînerait la lecture de données chiffrées sans qu’elles ne soient déchiffrées par Citrix Endpoint Management. Cette technique a été couronnée de succès dans toutes les applications testées avec Citrix Endpoint Management, car la quantité de données mappées en mémoire est faible et aucune récupération de page mémoire ne se produit au sein de l’application.
-
Le chiffrement ajoute une surcharge mesurable. Les développeurs doivent optimiser les E/S disque pour éviter la dégradation des performances. Par exemple, si vous lisez et écrivez les mêmes informations de manière répétée, vous pourriez envisager d’implémenter un cache au niveau de l’application.
-
Citrix Endpoint Management ne chiffre que les instances de la bibliothèque Apple
libsqlite.dylib. Si l’application se lie directement à et/ou intègre une version privée delibsqlite.dylib, les instances de bases de données de cette bibliothèque privée ne sont pas chiffrées par Citrix Endpoint Management. -
Les bases de données Apple SQLite sont chiffrées par Citrix Endpoint Management à l’aide de la couche SQLite Virtual File System.
Les performances peuvent être un problème. La taille standard du cache de la base de données est de 2000 pages ou 8 mégaoctets. Si votre base de données est volumineuse, un développeur peut avoir besoin de spécifier un pragma SQLite pour augmenter la taille du cache de la base de données. Dans le framework Objective-C Core Data, le pragma SQLite peut être ajouté en tant que dictionnaire d’options lors de l’ajout de l’objet Persistent Store à l’objet Persistent Store Controller.
-
Le mode WAL de SQLite n’est pas pris en charge car la bibliothèque est reliée aux interfaces d’E/S de fichiers et utilise intensivement le mappage de mémoire en interne.
-
Le
NSURLCache DiskCacheest implémenté 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. -
Voici une liste des modèles de noms de chemins de fichiers exclus codés en dur :
-
.plist: Exclu en raison de l’accès par les processus système iOS en dehors du contexte du processus. -
.app: Sous-chaîne héritée dans le nom du bundle d’application. Cette sous-chaîne est obsolète car un chemin de bundle d’application explicite est désormais exclu. -
.db: Un fichier avec ce suffixe n’est pas chiffré si le fichier n’est pas une base de données SQLite. -
/System/Library: Les chemins de fichiers qui existent dans le répertoire sandbox du bundle d’application et les chemins de fichiers en dehors du sandbox des données de l’application ne peuvent pas être chiffré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 d’application que l’application produit et stocke lorsqu’elle est exécutée. -
Library/Preferences: Les fichiers sont directement accessibles par iOS. Normalement, seuls les fichiers.plistsont présents dans ce chemin de répertoire. -
/com.apple.opengl/: iOS accède directement aux fichiers. -
csdk.db: Base de données SQLite héritée de Citrix SSLSDK -
/Library/csdk.sql: Base de données SQLite de Citrix SSLSDK -
CtxLog_: Préfixe du nom de 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 de journaux MDX -
/Document/CitrixLogs.zip: Nom du répertoire de journaux MDX compressé - Tout fichier dans le chemin du répertoire du bundle d’application : Répertoire en lecture seule des fichiers d’application
-
-
Citrix Endpoint Management substitue une instance de la classe privée
Citrix Endpoint Management SecureViewControlleraux instances de la classe d’objet Apple Objective-CQLPreviewControllerau moment de l’exécution. La classeCitrix Endpoint Management SecureViewControllerest dérivée de la classe d’objet Apple Objective-CUIWebView. La classe d’objetQLPreviewControllerprend en charge nativement quelques formats de fichiers que la classe d’objetUIWebViewne prend pas en charge nativement, tels que les types audio et PDF. -
Pour de meilleures performances, les requêtes d’E/S de fichiers doivent être émises vers des décalages de fichiers qui sont un multiple de 4096 octets et doivent être émises pour une longueur qui est également un multiple de 4096 octets.
-
L’indicateur de mode de fichier
O_NONBLOCKn’est pas pris en charge par le chiffrement Citrix Endpoint Management. Cet indicateur de mode de fichier est supprimé de la liste des modes lorsqu’il est traité par Citrix Endpoint Management.
Entropie utilisateur pour le chiffrement
Une option de Citrix Endpoint Management pour le chiffrement exige que l’utilisateur final saisisse un code PIN avant que la clé de chiffrement ne puisse être générée. Cette option est appelée entropie utilisateur. Elle peut causer un problème particulier pour les applications.
Plus précisément, aucun accès aux fichiers ou aux bases de données ne peut être effectué tant que l’utilisateur n’a pas saisi un code PIN. Si une telle opération d’E/S est présente à un emplacement qui s’exécute avant que l’interface utilisateur du code PIN ne puisse être affichée, elle échouera toujours.
Pour vous assurer que ce problème n’est pas présent dans votre application, testez avec l’entropie utilisateur activée. La propriété client Citrix Endpoint Management, Chiffrer les secrets à l’aide d’un code d’accès, ajoute l’entropie utilisateur. Vous configurez cette propriété 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 conteneurisation des données
- Les contrôleurs de vue à distance n’auront pas de conteneurisation de sécurité (par exemple, chiffrement des données ; blocage des stratégies de copier, couper et coller ; etc.) car un contrôleur de vue à distance s’exécute dans un contexte de processus différent de celui de l’application gérée par MDX.
- L’action Copier est la seule action prise en charge par UIResponder. Les autres actions, telles que Couper et Supprimer, ne sont pas prises en charge.
- AirDrop n’est intercepté qu’au niveau de l’interface utilisateur, et non à un niveau inférieur.
- MFI et Bluetooth ne sont pas interceptés.
Prise en charge des fichiers d’icônes
L’encapsulation MDX nécessite la présence d’au moins une icône pouvant ê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 d’actifs (Asset Catalog) ou utiliser les clés CFBundleIcons ou CFBundleIconFiles dans Info.plist.
Le MDX Toolkit sélectionne la première parmi la liste des emplacements plist connus dans 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 émis directement par une application. Certaines requêtes DNS sont émises directement par le framework Apple et ne sont donc pas gérées par MDX.
Plusieurs options de stratégie Citrix Endpoint Management sont disponibles pour les administrateurs en matière de réseau.
La stratégie d’accès réseau empêche, autorise ou redirige l’activité réseau de l’application.
Important :
La version 18.12.0 du MDX Toolkit incluait de nouvelles stratégies qui combinaient ou remplaçaient des stratégies plus anciennes. La stratégie d’accès réseau combine l’accès réseau, le mode VPN préféré et l’autorisation de basculement de mode VPN. La stratégie de liste d’exclusion remplace la liste d’exclusion de tunnel partagé. La stratégie de session micro VPN requise remplace la session en ligne requise. Pour plus de détails, consultez Nouveautés des versions précédentes.
Tunneled - Web SSO est le nom de la navigation sécurisée dans les paramètres. Le comportement est le même.
Les options sont les suivantes :
- Utiliser les paramètres précédents : Par défaut, les valeurs que vous aviez définies dans les stratégies précédentes sont utilisées. Si vous modifiez cette option, vous ne devez pas revenir à Utiliser les paramètres précédents. Notez également que les modifications apportées aux nouvelles stratégies ne prennent effet qu’après la mise à niveau de l’application par l’utilisateur vers la version 18.12.0 ou ultérieure.
- Bloqué : Les API réseau utilisées par votre application échoueront. Conformément à la directive précédente, vous devez gérer cet échec avec élégance.
- Non restreint : Tous les appels réseau sont directs et ne sont pas tunnellisés.
- Tunnélisé - VPN complet : Tout le trafic de l’application gérée est tunnellisé via Citrix Gateway.
- Tunnélisé - Web SSO : L’URL HTTP/HTTPS est réécrite. Cette option permet uniquement le tunnellisation du trafic HTTP et HTTPS. Un avantage significatif de Tunnélisé - Web SSO est l’authentification unique (SSO) pour le trafic HTTP et HTTPS, ainsi que l’authentification PKINIT. Sur Android, cette option a une faible surcharge de configuration et est donc l’option préférée pour les opérations de navigation web.
- Tunnélisé - VPN complet et Web SSO : Permet de basculer automatiquement entre les modes VPN selon les besoins. Si une requête réseau échoue en raison d’une demande d’authentification qui ne peut pas être gérée dans un mode VPN spécifique, elle est relancée dans un mode alternatif.
Limitations
- Les utilisateurs ne peuvent pas lire de vidéos hébergées sur des sites web internes dans les applications MDX encapsulées pour iOS, 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 d’accès réseau est définie sur Bloqué. Nous ne tunnellisons pas le trafic UDP si la stratégie d’accès réseau est définie sur Tunnélisé - VPN complet.
- Les applications encapsulées par MDX ne peuvent pas instancier un serveur de sockets qui écoute les connexions entrantes. Cependant, les applications encapsulées par MDX peuvent utiliser un socket client pour se connecter à un serveur.
Prise en charge des bibliothèques tierces
Certains frameworks d’application présentent des problèmes de compatibilité avec Citrix Endpoint Management :
- Les applications développées avec l’environnement de développement multiplateforme Xamarin sont prises en charge. Citrix ne déclare pas officiellement la prise en charge d’autres environnements de développement multiplateformes en raison d’un nombre insuffisant d’exemples d’utilisation et de tests.
- SQLCipher ne fonctionne pas avec le chiffrement car il utilise le mappage mémoire. Une solution consiste à ne pas utiliser SQLCipher. Une deuxième solution consiste à exclure le fichier de base de données du chiffrement à l’aide d’une stratégie d’exclusion de chiffrement. Un administrateur Citrix Endpoint Management doit configurer la stratégie dans la console Citrix Endpoint Management.
- Les applications et les bibliothèques tierces qui se lient directement aux bibliothèques OpenSSL libcrypto.a et libssl.a peuvent entraîner une erreur de liaison due à des symboles manquants et des erreurs de liaison dues à des définitions de symboles multiples.
- Les applications nécessitant la prise en charge du service de notification push d’Apple (Apple Push Notification Service) doivent suivre des étapes spécifiques requises par Apple.
- Citrix Endpoint Management définit explicitement la version de la base de données SQLite sur 1 afin de désactiver la prise en charge des fichiers de journalisation anticipée (WAL) et des fichiers mappés en mémoire dans les bases de données SQLite. Toute tentative d’accès direct aux interfaces SQLite dans SQLite version 2 ou version 3 échoue.
Dans cet article
- Framework MDX App SDK et encapsulage
- Utiliser des ID d’application explicites
- Ne bloquez pas le thread principal
- Écrire du code robuste
- Utiliser uniquement les interfaces publiées par Apple
- Rediriger les interfaces d’exécution
- Assurer la compatibilité du chiffrement des données
- Entropie utilisateur pour le chiffrement
- Compatibilité de la conteneurisation des données
- Prise en charge des fichiers d’icônes
- Réseau et micro VPN
- Prise en charge des bibliothèques tierces