Anzeigen: Delphi C++
Anzeigeeinstellungen

Einführung in iOS Objective-C-DataSnap-Konnektoren für mobile Geräte

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Einführung in DataSnap-Konnektoren für mobile Geräte


Dieses Thema dient als Leitfaden für die ersten Schritte beim Erstellen und Verwenden des iOS-DataSnap-Proxy für Objective-C bei der mobilen iPhone-Entwicklung. Der iOS-Proxy unterstützt dieselben Datentypen wie DataSnap. Zur Kapselung dieser DBX- und Delphi-Typen wurden spezielle Objective-C-Klassen erstellt. Deren Verwendung entspricht der in Delphi.

Auf Anforderung erzeugt der DataSnap-REST-Server die zum Aufruf der Methoden auf dem Server verwendete Proxy-Klasse und sendet diese. Dies entspricht weitgehend der Proxy-Erzeugung, die Ihnen wahrscheinlich bereits vertraut ist, umfasst aber zudem das Komprimieren des Proxy und aller abhängigen Dateien sowie das Senden der zip-Datei an den Anforderer. Weitere Informationen über diesen Prozess finden Sie unter Einführung in DataSnap-Konnektoren für mobile Geräte.

Inhaltsverzeichnis

Herunterladen der iOS-Proxy-Dateien vom Server

Zunächst müssen Sie sich eine Kopie von javaProxyDownloader.jar beschaffen, die in Ihrer Produktinstallation vefügbar ist, wie z.B.:

  • C:\Program Files (x86)\Embarcadero\RAD Studio\9.0\bin
  • C:\Program Files\Embarcadero\RAD Studio\9.0\bin

Diese Datei des Proxy-Download-Programms und die Beschaffung einer Kopie davon wird im Thema Einführung in DataSnap-Konnektoren für mobile Geräte ausführlicher behandelt. Das Download-Programm ist ein einfaches Hilfsprogramm zur Unterstützung der Ermittlung des Proxy und anderer für die Kommunikation mit dem Server erforderlicher Dateien auf dem Server.

Für das Download-Programm müssen Sie die folgenden Parameter angeben:

  • -language (erforderlich): Gibt die mobile Plattform/Sprache des angeforderten Proxy an. Verwenden Sie für die iPhone-Entwicklung objectivec_ios42.
  • -protocol: Gibt das zu verwendenden Verbindungsprotokoll an: http oder https. Die Vorgabe ist http.
  • -host: Gibt den Port und den Hostnamen oder die IP-Adresse an, zu der verbunden werden soll. Vorgabe ist localhost mit Port 80. Wenn ein anderer Name oder Port benötigt wird, muss der Name voll qualifiziert sein und die durch Doppelpunkt (":") getrennte Portnummer enthalten.
  • -output: Gibt den Ordner an, in den die Proxy-Dateien heruntergeladen werden sollen. Wird diese Angabe weggelassen, wird der aktuelle Ordner verwendet.

Im folgenden Beispiel werden die meisten der oben beschriebenen Parameter verwendet:

java-jar javaProxyDownloader.jar -language objectivec_ios42 -host 127.0.0.1:8080

Nach Ausführung des Download-Programms werden die Objectivec_ios42-Proxy-Dateien in den angegebenen Ausgabeordner kopiert. Der Proxy umfasst:

  • JSON-Bibliothek
  • Statische für den Proxy erforderliche Objective-C-Quelldateien
  • DSProxy.h, der erzeugte Proxy

Die Hauptdateien sind DSProxy.h und DSProxy.m, die die Klasse enthalten, die alle auf dem Server definierten Methoden kapselt.

Importieren Sie diese Dateien in Ihr Xcode-Projekt, wie auf der folgenden Abbildung gezeigt:

Xcodeproj.png

Verwendung der DSProxy-Klasse

Der folgenden Code zeigt die vom Server erzeugten Dateien DSProxy.h und DSProxy.m. Der Code enthält eine TServerMethods1-Klasse, die die Servermethoden kapselt. Der Server hat nur eine Methode (EchoString), und die Objective-C-Klasse TServerMethods1 implementiert die Methode entsprechend. Der Proxy-Generator erzeugt den gesamten Code für die Verbindung zum Server und für die Ausführung der Methoden automatisch. Siehe den folgenden Objective-C-Code für die Methode EchoString:

DSProxy.h (ohne Importe)

 @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];
   }
   -(void) dealloc {
     [super dealloc];
   }
 
 /**
  * @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

Verwenden der Proxy-Klasse

Der erste Schritt bei der Verwendung der Proxy-Klasse umfasst das Erstellen und Einrichten einer Verbindung zu dem Server. Die Klasse DSRESTConnection kapselt alle für die Verbindung zum Server erforderlichen Eigenschaften und Methoden. Erstellen Sie die Verbindung, und konfigurieren Sie die Eigenschaften in Objective-C wie folgt:

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

Die Methode initWithDelegate ermöglicht das Festlegen des Delegatobjekts, das auf Verbindungsereignisse reagiert. Siehe die Kategorie NSObject (NSURLConnectionDelegate) für Ereignisse, auf die die Methode reagieren kann.

  • Die Eigenschaft host gibt den Hostnamen oder die IP-Adresse an.
  • Die Eigenschaft port gibt den Port an, über den der Server empfängt.
  • Die Eigenschaft protocol gibt das für die Verbindung zu verwendende Protokoll an: http oder https.
Hinweis: Bei Verwendung des Protokolls "https" müssen Sie möglicherweise auf die folgenden Ereignisse zum Untersuchen des Zertifikats reagieren. Siehe die Apple-Dokumentation für weitere Informationen:
  • (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace;
  • (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;
Zum Remote-Aufruf der Servermethoden erstellen Sie einfach mit Objective-C die Proxy-Klasse, übergeben die Verbindung und rufen dann die folgende Methode auf:

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

Verwenden von Heavyweight-Callbacks

Mit Heavyweight-Callbacks können DataSnap-Server fast verzögerungsfreie Benachrichtigungen an REST-Clients senden. Ein Client kann eine Callback-Funktion für ein bestimmtes, auf dem Server vorhandenes Thema registrieren. Bei Aktualisierung dieses Themas erhält der Client dann eine Benachrichtigung. Dies ist natürlich eine sehr vereinfachte Beschreibung dessen, was Heavyweight-Callbacks ausführen, sollte aber an dieser Stelle ausreichen.

Der erste Schritt bei der Verwendung von Callbacks in Ihren Anwendungen umfasst das Erstellen eines neuen Nachkommen von DBXCallback. DBXCallback verfügt über die abstrakte Methode "execute", die von Nachkommen überschrieben werden muss. Diese Methode wird ausgeführt, wenn der Server Benachrichtigungen sendet. Im Folgenden finden Sie eine Beispielimplementierung dieser Klasse:

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

Die Methode "execute" erhält ein TJSONArray als "params", das die vom Server kommenden Daten enthält, und kann an den Server einen TJSONValue zurückgeben. In diesem Beispiel wird nur eine Beschreibung der Parameter protokolliert und TJSONTrue zurückgegeben.

Nach Implementierung der Callback-Funktion müssen Sie diese auf dem Server registrieren. Dies erfolgt mit der Klasse DSCallbackChannelManager. Diese Klasse bietet alle Methoden für die Registrierung einer Callback-Funktion beim Server.

DSCallbackChannelManager erstellt einen einzelnen Kanal zwischen dem Client und dem Server, und die gesamte Kommunikation wird über diesen Kanal ausgeführt. Viele Clients können sich bei demselben Kanal registrieren und erhalten über diesen Kanal Benachrichtigungen. Mit dem folgenden Code wird der Manager erstellt:

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


DSCallbackChannelManager benötigt die Verbindung und den Kanalnamen, zu dem verbunden werden soll. Die Initialisierung setzt das Delegatobjekt, das auf die Verbindungsereignisse reagieren kann.

Nach Erstellung des Kanals können Sie Callbacks bei dem Kanal registrieren. Jede registrierte Callback-Funktion muss einen eindeutigen Namen (eindeutig für den Client-Kanalmanager) und eine Callback-Instanz für die Benachrichtigungen haben. Mit der Methode registerCallback des Managers können Sie diese Callbacks registrieren:

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

Dieses Beispiel registriert eine Callback-Funktion namens mycb01. Durch Registrierung der Callback-Funktion wird sofort die Kommunikation zwischen Server und Client gestartet. Im Hintergrund wartet der DSCallbackChannelManager auf vom Server eingehende Ereignisse und führt die Callback-Funktion jedes Mal aus, wenn diese Ereignisse ausgelöst werden.

Die Verbindung bleibt geöffnet, bis Sie sie schließen oder bis sie vom Server geschlossen wird. Zum Anhalten der Verbindung können Sie die Callback-Funktion deregistrieren und den Kanal wie im Folgenden gezeigt schließen:

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

Siehe auch

In anderen Sprachen