API de MDX para iOS

27 de febrero de 2018

La API de XenMobile para iOS se basa en Objective-C. En este artículo se resumen las API de XenMobile por característica y se ofrecen las definiciones de cada API.

Administración de aplicaciones

  • isAppManaged

Interacción con Secure Hub

  • isMDXAccessManagerInstalled
  • logonMdxWithFlag
  • isAppLaunchedByWorxHome

Directivas MDX

  • getValueOfPolicy

Caja fuerte compartida

  • getVaultDataFromVault
  • saveVaultData
  • updateAndSynchronizeVaultItem
  • updateAndSynchronizeVaultItems
  • deleteVault
  • deleteVaultWithError

Datos del usuario

  • managedUserInformation

Clase MdxManager

Métodos

  • getValueOfPolicy

    +(NSString*) getValueOfPolicy:(NSString*)policyName error:(NSError **) error;

    Para aplicaciones administradas, devuelve el valor de directiva establecido por los administradores de XenMobile. Para las aplicaciones Premium no administradas, devuelve el valor de directiva establecido en Applications/Citrix/MDXToolkit/data/MDXSDK/default_policies.xml. Para las aplicaciones “General” no administradas, devuelve un valor nil.

    Parámetros:

    policyName. El nombre de la directiva a buscar en default_policies.xml.

    Ejemplo:

    +(NSString*) getValueOfPolicy:(NSString*)DisableCamera error:(NSError **) error;

  • isMDXAccessManagerInstalled

    +(BOOL) isMDXAccessManagerInstalled: (NSError **) error;

    Comprueba si está instalado Secure Hub, lo que significa que el control MDX de la aplicación está habilitado incluso aunque la aplicación no esté administrada. Devuelve true si Secure Hub está instalado.

  • isAppManaged

    +(BOOL) isAppManaged;

    Comprueba si MDX administra la aplicación en ese momento, lo que significa que el paquete de directivas MDX está incrustado en la aplicación como un archivo XML. Se consulta la infraestructura back-end de XenMobile (cajas fuertes de claves) para obtener claves parcialmente cifradas (secretos) que MDX usará para cifrar los datos de la aplicación en la base de datos (iOS 9). Devuelve true si la aplicación está administrada.

  • logonMdxWithFlag

    +(BOOL) logonMdxWithFlag:(BOOL)force error:(NSError**) error;

    Inicia una solicitud de inicio de sesión MDX en Secure Hub.

  • isAppLaunchedByWorxHome

    +(BOOL) isAppLaunchedByWorxHome;

    Comprueba si una solicitud de URL entre aplicaciones proviene de Secure Hub o alguna otra aplicación en el dispositivo, lo que es necesario si una aplicación necesita conocer si la comunicación se controla por MDX. En iOS, las aplicaciones pueden registrar esquemas de URL específicos. Un esquema de URL es la primera parte de una dirección URL, hasta los dos puntos (no incluidos). Si una URL empieza por http://, el esquema es http.

    Las aplicaciones habilitadas para MDX y Secure Hub se comunican usando esquemas de URL personalizados. Por ejemplo, para gestionar las direcciones URL mailto: desde otras aplicaciones, Secure Mail requiere el esquema de URL ctxmail. Para gestionar las direcciones URL de http o https desde otras aplicaciones, Secure Web requiere el esquema de URL ctxmobilebrowser o ctxmobilebrowsers, respectivamente. Para obtener más información acerca de la directiva “Esquemas de URL de aplicaciones” y la directiva “Direcciones URL permitidas” para MDX, consulte Directivas MDX de XenMobile para aplicaciones iOS en la documentación de MDX Toolkit.

    Devuelve resultados precisos cuando se consulta en cualquier momento o en cualquier lugar, durante o después de las siguientes llamadas de evento delegado UIApplication:

    • Cuando la aplicación se carga desde el springboard o una llamada openURL:

       application:willFinishLaunchingWithOptions:
      
       application:didFinishLaunchingWithOptions:
      
       applicationDidFinishLaunching:
      
    • Cuando los usuarios activan o reactivan la aplicación desde el springboard del dispositivo

       applicationDidBecomeActive:
      

    Importante:

    No se debe consultar durante applicationWillEnterForeground:.

    • Cuando la aplicación se activa o se reactiva con una llamada openURL:

       application:openURL:sourceApplication:annotation:
      
       application:handleOpenURL:
      
  • managedUserInformation

    extern __attribute__((visibility ("default"))) NSString *const kXenMobileUsername; +(NSDictionary*) managedUserInformation;

    Devuelve una cadena que contiene el nombre de usuario de un usuario inscrito que ejecuta una aplicación administrada por MDX, independientemente del estado de inicio de sesión del usuario. Devuelve una cadena vacía si el usuario no está inscrito, la aplicación no está administrada o no está empaquetada.

Clase XenMobileSharedKeychainVault

Métodos

  • initWithVaultName

    - (instancetype) initWithVaultName:(NSString*)vaultName accessGroup:(NSString*)accessGroup;

    Inicializa una caja fuerte compartida de XenMobile.

    Use la API de caja fuerte compartida para compartir contenido administrado entre las aplicaciones que tienen el mismo grupo de Acceso a Llaveros. Por ejemplo, puede compartir certificados de usuario a través de una aplicación inscrita, de modo que las aplicaciones pueden obtener un certificado de la caja fuerte segura, en lugar de obtenerlo de Secure Hub.

    Parámetros:

    vaultName. El nombre de la caja fuerte compartida de XenMobile.

    accessGroup. El nombre del grupo de Acceso a Llaveros. Puede ser el grupo de acceso predeterminado MDX, llamado TEAMID_A.appOriginalBundleID, o un grupo de Acceso a Llaveros que se va a usar para compartir datos entre aplicaciones.

  • Propiedades de los tipos de datos que puede haber en la caja fuerte

       @property(nonatomic,readonly) BOOL exists;
    
       @property(nonatomic,readonly) BOOL isAccessible;
    
       @property(nonatomic,strong) NSMutableDictionary* vaultData
    

    Después de inicializar una caja fuerte, se devuelven estas propiedades de tipo de datos de caja fuerte:

    exists. Indica si se ha encontrado la caja fuerte con el nombre vaultName especificado.

    isAccessible. Indica si la caja fuerte se encuentra en el grupo accessGroup especificado y si se puede acceder a ella.

    vaultData. El contenido de la caja fuerte compartida. La primera vez que inicialice la caja fuerte, vaultData es un valor de diccionario nulo.

  • getVaultDataFromVault

    + (NSDictionary*) getVaultDataFromVault:(NSString*)vaultName accessGroup:(NSString*)accessGroup error:(NSError *__autoreleasing *)error;

    Lee datos desde la caja fuerte compartida de XenMobile. Esta es una de las tres maneras de leer los datos de la caja fuerte:

    • Use directamente getVaultDataFromVault:accessGroup:error.

    • Cree la instancia XenMobileSharedKeychainVault y luego lea la propiedad vaultData.

    • Cree la instancia XenMobileSharedKeychainVault y, a continuación, vuelva a cargar los datos de la caja fuerte con -(BOOL) loadDataWithError:(NSError *__autoreleasing *)error; y lea la propiedad vaultData.

    Para obtener un ejemplo de código, consulte “Ejemplo de caja fuerte compartida” en este artículo.

    Parámetros:

    vaultName. El nombre de la caja fuerte compartida de XenMobile.

    accessGroup. El nombre del grupo de Acceso a Llaveros. Puede ser el grupo de acceso predeterminado MDX, llamado TEAMID_A.appOriginalBundleID, o un grupo de Acceso a Llaveros que se va a usar para compartir datos entre aplicaciones.

  • saveVaultData

    + (BOOL) saveVaultData:(NSDictionary*)vaultData toVault:(NSString*)vaultName accessGroup:(NSString*)accessGroup error:(NSError *__autoreleasing *)error;

    Guarda datos en la caja fuerte compartida de XenMobile. Esta es una de las tres maneras de guardar los datos de la caja fuerte:

    • Use directamente saveVaultData:toVault:accessGroup:error:.

    • Use updateAndSynchronizeVaultItem: o updateAndSynchronizeVaultItems (descritos a continuación en esta tabla).

    • Use - (BOOL)synchronizeWithError:(NSError *__autoreleasing *)error; tras crear la instancia XenMobileSharedKeychainVault, cargar datos de la caja fuerte, modificar esos datos y, a continuación, sincronizarlos.

    Para obtener un ejemplo de código, consulte “Ejemplo de caja fuerte compartida” en este artículo.

    Parámetros:

    vaultData. Los datos que se guardarán en la caja fuerte compartida de XenMobile. Los datos almacenados en la caja fuerte compartida son un diccionario de pares clave/valor, como @{@”NombreDeUsuario”:@”andreo”}.

    vaultName. El nombre de la caja fuerte compartida de XenMobile.

    accessGroup. El nombre del grupo de Acceso a Llaveros. Puede ser el grupo de acceso predeterminado MDX, llamado TEAMID_A.appOriginalBundleID, o un grupo de Acceso a Llaveros que se va a usar para compartir datos entre aplicaciones.

  • updateAndSynchronizeVaultItem

    updateAndSynchronizeVaultItems

    - (BOOL)updateAndSynchronizeVaultItem:(NSString*)vaultItem withValue:(id)itemValue error:(NSError *__autoreleasing *)error;

    - (BOOL)updateAndSynchronizeVaultItems:(NSDictionary*)vaultItems error:(NSError *__autoreleasing *)error;

    Actualiza los datos contenidos en la caja fuerte compartida de XenMobile. Para usar este método, cree la instancia XenMobileSharedKeychainVault y, a continuación, sincronícela agregando o actualizando los elementos en la caja fuerte. Por ejemplo, si la entrada existente de caja fuerte contiene {a:123, b:234, c:305} y se usa esta API con datos para actualizar {c:345, d:456}, esta API actualizará los datos de la caja fuerte a {a:123, b:234, c:345, d:456}. Para obtener un ejemplo de código, consulte “Ejemplo de caja fuerte compartida” en este artículo.

    Consulte saveVaultData, descrito anteriormente, para conocer otras dos maneras de guardar los datos de la caja fuerte.

    Parámetros:

    vaultItem. Un par único de clave/valor, en el formato @{@";username::@"andreo"}.

    vaultItems. Una lista de pares clave/valor.

  • deleteVault

    + (BOOL) deleteVault:(NSString*)vaultName accessGroup:(NSString*)accessGroup error:(NSError *__autoreleasing *)error;

    Elimina la caja fuerte compartida especificada.

    Parámetros:

    vaultName. El nombre de la caja fuerte compartida de XenMobile.

    accessGroup. El nombre del grupo de Acceso a Llaveros que utiliza la caja fuerte que quiere eliminar.

  • deleteVaultWithError

    -(BOOL) deleteVaultWithError:(NSError *__autoreleasing *)error;

    Elimina la caja fuerte compartida que devuelve la instancia XenMobileSharedKeychainVault. Debe liberar el objeto después de eliminarlo con deleteVaultWithError.

Ejemplo de caja fuerte compartida

#import "XenMobileSharedKeychainVault.h"

@interface ClassA ()
...
@property(nonatomic,strong) XenMobileSharedKeychainVault* XenMobileSharedKeychainVault;
...
@end

@implementation ClassA
...
@synthesize XenMobileSharedKeychainVault = _XenMobileSharedKeychainVault;


...
#ifdef USE_CLASS_INSTANCE_METHODS
-(XenMobileSharedKeychainVault*)XenMobileSharedKeychainVault
{
if(_XenMobileSharedKeychainVault==nil) {
_XenMobileSharedKeychainVault = [[XenMobileSharedKeychainVault alloc]
      initWithVaultName:<VAULT_NAME>
      accessGroup:kXenMobileKeychainAccessGroup];
}
return _XenMobileSharedKeychainVault;
}
#endif

-(void)read
{
NSError* error=nil;
#ifdef USE_CLASS_INSTANCE_METHODS
NSDictionary* vaultDictionary = nil;
if([self.XenMobileSharedKeychainVault loadDataWithError:&error]) {
vaultDictionary = [self.XenMobileSharedKeychainVault vaultData];
}
#else
NSDictionary* vaultDictionary = [XenMobileSharedKeychainVault
      getVaultDataFromVault:<VAULT_NAME>
      accessGroup:kXenMobileKeychainAccessGroup error:&error];
#endif

}

-(void)save
{
NSError* error=nil;
/// check error handling here...

NSDictionary* dictToSave = @{<VAULT_DATA_DICTIONARY_OBJECTS>};
#ifdef USE_CLASS_INSTANCE_METHODS
#ifdef USE_CLASS_INSTANCE_METHODS_TO_UPDATE
BOOL result = [self.XenMobileSharedKeychainVault
      updateAndSynchronizeVaultItems:dictToSave error:&error];
#else
self.XenMobileSharedKeychainVault.vaultData = [NSMutableDictionary
      dictionaryWithDictionary:dictToSave];
BOOL result = [self.XenMobileSharedKeychainVault synchronizeWithError:&error];
#endif
#else
BOOL result = [XenMobileSharedKeychainVault
      saveVaultData:dictToSave toVault:<VAULT_NAME>
      accessGroup:kXenMobileKeychainAccessGroup error:&error];
#endif

}

-(void)delete
{
NSError* error=nil;
#ifdef USE_CLASS_INSTANCE_METHODS
BOOL result = [self.XenMobileSharedKeychainVault deleteVaultWithError:&error];
#else
BOOL result = [XenMobileSharedKeychainVault deleteVault:<VAULT_NAME>
      accessGroup:kXenMobileKeychainAccessGroup error:&error];
#endif

}

...

@end

API de MDX para iOS