Introduction au connecteur mobile iOS Objective-C DataSnap

De RAD Studio
Aller à : navigation, rechercher

Remonter à Introduction aux connecteurs mobiles DataSnap


Cette rubrique est un guide d'introduction à la génération et à l'utilisation du proxy Objective-C iOS DataSnap, pour un usage avec le développement mobile iPhone. Le proxy iOS prend en charge les mêmes types de données que DataSnap. Des classes Objective-C spéciales ont été créées pour encapsuler ces types DBX et Delphi, et leur usage est similaire à celui dans Delphi.

A la demande, le serveur DataSnap REST génère et répartit la classe proxy utilisée pour invoquer les méthodes sur le serveur. C'est très similaire à la génération de proxy que vous connaissez déjà, mais vous avez en plus le processus de zippage du proxy et de toutes les dépendances, et l'envoi du fichier zip au demandeur. Pour de plus amples informations sur ce processus, voir Introduction aux connecteurs mobiles DataSnap.

Comment télécharger les fichiers proxy iOS à partir du serveur

Pour télécharger les fichiers proxy iOS à partir du serveur, vous devez utiliser le téléchargeur de proxy. Cet utilitaire simple demande au serveur les fichiers proxy et autres nécessaires à la communication avec le serveur. Le téléchargeur de proxy se trouve dans :

C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\javaProxyDownloader.jar

Pour utiliser le téléchargeur de proxy, vous devez fournir un paramètre -language, qui spécifie la plate-forme mobile et le langage de programmation du proxy demandé. Pour le développement iOS, utilisez objectivec_ios81 :

java -jar javaProxyDownloader.jar -language objectivec_ios81

Vous pouvez facultativement utiliser l'une quelconque des options de ligne de commande suivantes :

  • -host : Spécifie le port et l'adresse IP ou le nom de l'hôte sur lequel se connecter. L'hôte par défaut est localhost avec le port 80. Si un port ou un nom différent est nécessaire, le nom doit être entièrement qualifié avec le numéro de port inclus, séparé par un deux-points (:).
  • -protocol : Spécifie le protocole de connexion à utiliser. Il peut s'agir de http ou https. Le protocole par défaut est http.
  • -output : Spécifie le dossier dans lequel télécharger les fichiers proxy. S'il n'est pas spécifié, le dossier en cours est utilisé.

Par exemple :

java -jar javaProxyDownloader.jar -language objectivec_ios81 -protocol https -host 127.0.0.1:8080 -output output_folder

Après l'exécution du téléchargeur de proxy, les fichiers proxy objectivec_ios81 sont copiés dans le dossier de sortie spécifié. Les fichiers proxy incluent :

  • Une bibliothèque JSON.
  • Les fichiers source Objective-C statiques requis par le proxy.
  • DSProxy.h, le fichier d'en-tête proxy généré.

Les fichiers principaux, DSProxy.h et DSProxy.m, contiennent la classe qui encapsule toutes les méthodes définies sur le serveur.

Importez ces fichiers dans votre projet Xcode :

Xcodeproj.png

Comment utiliser la classe DSProxy

Le code ci-dessous montre les fichiers DSProxy.h et DSProxy.m générés par le serveur. Le code contient une classe TServerMethods1, qui encapsule les méthodes serveur. Le serveur a seulement une méthode (EchoString), et la classe Objective-C TServerMethods1 implémente la méthode en conséquence. Le générateur de proxy a automatiquement généré le code pour la connexion au serveur et l'exécution des méthodes. Voir le code Objective-C pour la méthode EchoString ci-dessous :

DSProxy.h (avec exclusion des importations)

 @interface TServerMethods1:DSAdmin{
 }

 /**
  * @param Value [in] - Type on server: string
  * @return result - Type on server: string
  */
   -(NSString *) EchoString: (NSString *) value ;
 @end

DSProxy.m

#import "DSProxy.h"

@implementation TServerMethods1
  -(id) getTServerMethods1_EchoString {
    return  [NSArray arrayWithObjects:
      [DSRESTParameterMetaData parameterWithName: @"Value" withDirection:Input withDBXType:WideStringType withTypeName:@"string"],
      [DSRESTParameterMetaData parameterWithName: @"" withDirection:ReturnValue withDBXType:WideStringType withTypeName:@"string"],
    nil];
  }

  -(id) getTServerMethods1_ReverseString {
    return  [NSArray arrayWithObjects:
      [DSRESTParameterMetaData parameterWithName: @"Value" withDirection:Input withDBXType:WideStringType withTypeName:@"string"],
      [DSRESTParameterMetaData parameterWithName: @"" withDirection:ReturnValue withDBXType:WideStringType withTypeName:@"string"],
    nil];
  }

  -(id) getTServerMethods1_VarParamTest {
    return  [NSArray arrayWithObjects:
      [DSRESTParameterMetaData parameterWithName: @"Value" withDirection:InputOutput withDBXType:WideStringType withTypeName:@"string"],
      [DSRESTParameterMetaData parameterWithName: @"" withDirection:ReturnValue withDBXType:WideStringType withTypeName:@"string"],
    nil];
  }

/**
 * @param Value [in] - Type on server: string
 * @return result - Type on server: string
 */
  -(NSString *) EchoString: (NSString *) value {

    DSRESTCommand * cmd = [[self Connection ] CreateCommand];
    cmd.RequestType =  GET;
    cmd.text= @"TServerMethods1.EchoString";
    [cmd  prepare:[self getTServerMethods1_EchoString]];

    [[[cmd.parameters objectAtIndex:0]getValue]SetAsString:value];

    [Connection execute: cmd];

    return [[[cmd.parameters objectAtIndex:1]getValue]GetAsString];
  }
@end

Utilisation de la classe proxy

La première étape de l'utilisation de la classe proxy consiste à créer et à configurer une connexion au serveur. La classe DSRESTConnection encapsule toutes les propriétés et méthodes nécessaires à la connexion au serveur. Créez simplement la connexion et configurez les propriétés dans Objective-C, comme illustré ci-dessous :

DSRestConnection * connection = [[DSRESTConnection alloc]initWithDelegate:self];
connection.Host = @"192.168.3.90";
connection.Port = 8080;
connection.protocol = @"http";

La méthode initWithDelegate vous permet de spécifier l'objet délégué qui répond aux événements de connexion. Voir la catégorie NSObject (NSURLConnectionDelegate) pour visualiser les événements auxquels il peut répondre.

  • La propriété host spécifie le nom de l'hôte ou l'adresse IP.
  • La propriété port spécifie le port sur lequel le serveur écoute.
  • La propriété protocol spécifie le protocole à utiliser pour la connexion. Spécifiquement, http ou https.
Remarque : Si vous utilisez le protocole https, vous devrez répondre aux événements suivants pour inspecter le certificat. Pour de plus amples informations, voir la documentation Apple :
  • (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace;
  • (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

Pour invoquer à distance les méthodes serveur, utilisez simplement Objective-C pour créer la classe proxy, en passant la connexion, puis appelez la méthode :

client = [[ExampleServerMethods alloc] initWithConnection:connection];
 NSLog("%@"  ,[client EchoString: @"string to echo"]);

Comment utiliser les rappels avancés

Les rappels avancés constituent pour les serveurs DataSnap un moyen d'envoyer des notifications presque instantanées aux clients REST. Un client peut recenser un rappel pour une rubrique spécifique du serveur qui l'intéresse. Ainsi, à chaque fois que cette rubrique est mise à jour, le client reçoit une notification. C'est, bien entendu, une description très simplifiée de ce que les rappels avancés accomplissent, mais qui doit être suffisante pour les besoins de cette tâche.

La première étape lors de l'utilisation des rappels dans votre application consiste à créer un nouveau descendant de DBXCallback. DBXCallback a une méthode abstraite "execute" que les descendants doivent redéfinir. Cette méthode est exécutée quand le serveur envoie des notifications. Un exemple d'implémentation de cette classe est présenté ci-dessous :

@interface MyCallBack : DBXCallback
{
}

@implementation MyCallBack

-(TJSONValue *) execute:(TJSONArray *)params{
       NSLog(@"consume [MyCallback.execute] %@ ",[params description]);
       return [[TJSONTrue alloc]init];
}

La méthode execute reçoit un TJSONArray en paramètre contenant les données provenant du serveur, et peut renvoyer un TJSONValue au serveur. Dans cet exemple, vous consignez simplement une description des paramètres et renvoyez un TJSONTrue.

Après l'implémentation du rappel, vous devez le recenser sur le serveur. La classe DSCallbackChannelManager est utilisée pour accomplir ceci. Elle offre toutes les méthodes servant à recenser un rappel avec le serveur.

DSCallbackChannelManager crée un canal unique entre le client et le serveur, et la communication entière s'exécute le long du canal spécifié. De nombreux clients peuvent recenser avec le même canal et recevoir une notification qui arrive sur ce canal. Voici le code qui crée le gestionnaire :

mngr = [[DSCallbackChannelManager alloc] initWithConnection:connection
             withChannel:@"mychannel"
          withManagerID:[DSCallbackChannelManager generateManagerID]
             withDelegate:self ];

DSCallbackChannelManager nécessite la connexion et le nom du canal sur lequel se connecter. L'initialisation définit l'objet délégué qui peut répondre aux événements de connexion.

Dès que vous avez créé le canal, vous pouvez recenser les rappels avec lui. Chaque rappel recensé doit avoir un nom unique (unique au gestionnaire du canal client) et une instance de rappel à utiliser pour les notifications. La méthode registerCallback du gestionnaire vous permet de recenser ces rappels :

MyCallBack * cb =[[MyCallBack alloc]init];
[mngr registerCallback:@"mycb01" WithDBXCallBack:cb];

L'exemple ci-dessus recense un rappel avec le nom "mycb01". Le recensement du rappel démarre immédiatement la communication entre le serveur et le client. En arrière-plan, le gestionnaire DSCallbackChannelManager attend les événements du serveur et exécute le rappel à chaque fois que ces événements se déclenchent.

La connexion reste ouverte tant que vous ne la fermez pas, ou qu'elle n'est pas fermée par le serveur. Pour arrêter la connexion, vous pouvez dérecenser le rappel et fermer le canal, comme présenté ci-dessous :

[mngr unregisterCallback:@"mycb01"];
[mngr closeClientChannel];

Voir aussi