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

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 leitet diese weiter. 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.

Herunterladen der iOS-Proxy-Dateien vom Server

Zum Herunterladen der iOS-Proxy-Dateien vom Server benötigen Sie das Proxy-Download-Programm, ein einfaches Hilfsprogramm zur Unterstützung der Ermittlung des Proxy und anderer für die Kommunikation mit dem Server erforderlicher Dateien auf dem Server. Sie finden das Proxy-Download-Programm unter:

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

Für das Proxy-Download-Programm müssen Sie den Parameter -language angeben, der die mobile Plattform und die Programmiersprache des angeforderten Proxy festlegt. Verwenden Sie für die iOS-Entwicklung objectivec_ios81:

java -jar javaProxyDownloader.jar -language objectivec_ios81

Optional können Sie die folgenden Befehlszeilenoptionen verwenden:

  • -host: Gibt den Port und den Hostnamen oder die IP-Adresse an, mit 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.
  • -protocol: Gibt das zu verwendenden Verbindungsprotokoll http oder https an. Das Vorgabeprotokoll ist http.
  • -output: Gibt den Ordern an, in den die Proxy-Dateien heruntergeladen werden sollen. Wird diese Angabe weggelassen, wird der aktuelle Ordner verwendet.

Zum Beispiel:

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

Nach Ausführung des Download-Programms werden die objectivec_ios81-Proxy-Dateien in den angegebenen Ausgabeordner kopiert. Die Proxy-Dateien enthalten:

  • Eine JSON-Bibliothek.
  • Statische für den Proxy erforderliche Objective-C-Quelldateien.
  • DSProxy.h, die generierte Proxy-Header-Datei.

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:

Xcodeproj.png

Verwenden der DSProxy-Klasse

Der folgende Code zeigt die vom Server generierten 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 automatisch den gesamten Code für die Verbindung mit dem Server und für die Ausführung der Methoden. 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];
  }

/**
 * @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 besteht aus dem Erstellen und Einrichten einer Verbindung mit 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. Weitere Informationen finden Sie in der Apple-Dokumentation:
  • (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"]);

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 ausreichend sein.

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];
}

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 legt das Delegatobjekt fest, das auf 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 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 die Kommunikation zwischen Server und Client sofort 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 folgendermaßen schließen:

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

Siehe auch