iOS Objective-C DataSnap モバイル コネクタ入門

提供: RAD Studio
移動先: 案内検索

DataSnap モバイル コネクタ入門 への移動


このトピックは、iPhone モバイル開発用に Objective-C iOS DataSnap プロキシを初めて生成して使用するためのガイドです。iOS プロキシでは、DataSnap 自体でサポートしているものと同じデータ型をすべてサポートしています。それらの DBX 型と Delphi 型をラップするための特別な Objective-C クラスが作成されており、それらの使い方は Delphi の場合と似ています。

DataSnap REST サーバーは、要求されると、サーバー上のメソッドを呼び出すためのプロキシ クラスを生成してディスパッチします。この方法は、既によくご存知だと思われるプロキシ生成と非常に似ていますが、プロキシとそれに依存するものをすべて zip 圧縮し、その zip ファイルを要求側に送信するという処理も含まれています。この処理の詳細については、「DataSnap モバイル コネクタ入門」を参照してください。

サーバーから iOS プロキシ ファイルをダウンロードする方法

iOS プロキシ ファイルをサーバーからダウンロードするには、プロキシ ダウンローダが必要です。これは、サーバーとの通信に必要なプロキシなどのファイルをサーバーに要求するのに役立つ、簡単なユーティリティです。プロキシ ダウンローダは以下の場所にあります。

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

プロキシ ダウンローダを使用するには、-language パラメータに、要求するプロキシのモバイル プラットフォームとプログラム言語を指定する必要があります。 iOS 開発の場合、objectivec_ios81 を使用します:

java -jar javaProxyDownloader.jar -language objectivec_ios81

必要に応じて、以下の任意指定のコマンドライン オプションを使用することもできます。

  • -host: 接続先のポートと、ホスト名または IP アドレスを指定します。デフォルトは、ホストが localhost、ポートが 80 です。これとは別の名前やポートが必要な場合は、名前を完全修飾名で指定し、コロン(:)で区切ってポート番号も含める必要があります。
  • -protocol: 使用する接続プロトコルとして http または https を指定します。デフォルト プロトコルは http です。
  • -output: プロキシ ファイルのダウンロード先となるフォルダを指定します。指定しない場合は、現在のフォルダが使用されます。

次に例を示します。

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

このようにプロキシ ダウンローダを実行すると、objectivec_ios81 プロキシ ファイルが、指定した出力フォルダにコピーされます。 プロキシ ファイルには以下のものがあります。

  • JSON ライブラリ
  • プロキシで必要となる静的な Objective-C ソース ファイル
  • DSProxy.h(生成されたプロキシ ヘッダー ファイル)

主なファイルは DSProxy.hDSProxy.m で、サーバー上で定義されているすべてのメソッドをカプセル化したクラスが含まれています。

これらのファイルを Xcode プロジェクトにインポートします。

Xcodeproj.png

DSProxy クラスの使用方法

次のコードは、サーバーで生成された DSProxy.h ファイルと DSProxy.m ファイルです。このコードには TServerMethods1 クラスが含まれていて、そこにサーバー メソッドがカプセル化されています。このサーバーにはメソッドが 1 つだけあり(EchoString)、Objective-C クラスの TServerMethods1 ではそれに合わせてメソッドを実装しています。サーバーへの接続とメソッドの実行に必要なコードがすべて、プロキシ ジェネレータにより自動的に生成されています。下に示す EchoString メソッドの Objective-C コードを参照してください。

DSProxy.h(インポート部分を除く)

 @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

プロキシ クラスの使用

プロキシ クラスを使用するには、まず、サーバーへの接続を作成しセットアップします。サーバーに接続するために必要なプロパティやメソッドはすべて、DSRESTConnection クラスにカプセル化されています。次に示すように、Objective-C で接続を作成し、プロパティをセットアップするだけです。

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

メソッド initWithDelegate では、接続イベントに応答するデリゲート オブジェクトを指定することができます。応答可能なイベントについては、NSObject(NSURLConnectionDelegate)カテゴリを参照してください。

  • host プロパティはホスト名または IP アドレスを指定します。
  • port プロパティはサーバーのリスン ポートを指定します。
  • protocol プロパティは、接続に使用するプロトコルを指定します。具体的には http または https です。
メモ: https プロトコルを使っている場合には、次のイベントに応答して証明書を調べる必要があるかもしれません。詳細情報は Apple 社のドキュメントを参照してください。
  • (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace;
  • (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

サーバー メソッドをリモートで呼び出すには、Objective-C で接続を渡してプロキシ クラスを作成し、メソッドを呼び出すだけです。

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

重量コールバックの使用方法

重量コールバックは、DataSnap サーバーから REST クライアントにほぼ瞬時に通知を送る手段となります。クライアントは、関心のあるサーバー上の特定のトピックにコールバックを登録でき、登録後は、そのトピックが更新されるたびに、通知を受け取ります。もちろんこれは、重量コールバックで行われる処理の非常に簡単な説明ですが、ここでの作業にはこれで十分なはずです。

アプリケーションでコールバックを使用するには、まず、DBXCallback の下位クラスを新しく作成します。DBXCallback には "execute" という抽象メソッドがあり、これを下位クラスでオーバーライドしなければなりません。このメソッドは、サーバーが通知を送るときに実行されます。このクラスの実装例を次に示します。

@interface MyCallBack : DBXCallback
{
}

@implementation MyCallBack

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

execute メソッドは、サーバーから送られるデータを含んだ TJSONArray をパラメータとして受け取り、場合により TJSONValue をサーバーに返します。この例では、パラメータの説明をログに記録し、TJSONTrue を返しているだけです。

コールバックを実装したら、次にそれをサーバーに登録する必要があります。そのためには DSCallbackChannelManager クラスを使います。このクラスでは、コールバックをサーバーに登録するためのすべてのメソッドを提供しています。

DSCallbackChannelManager によってクライアントとサーバーの間に 1 つのチャネルが作成され、その指定されたチャネルを通じてすべての通信が行われます。多数のクライアントが同じチャネルに登録し、そのチャネルから到着する通知を受け取ることができます。このマネージャを作成するコードは以下のとおりです。

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

DSCallbackChannelManager には、接続と接続先のチャネル名を渡す必要があります。初期化処理では、接続イベントに応答できるデリゲート オブジェクトを設定します。

チャネルを作成したら、そこにコールバックを登録することができます。登録するコールバックはそれぞれ、一意の名前(クライアント チャネル マネージャから見て一意)と、通知に使用するコールバック インスタンスを持っている必要があります。マネージャの registerCallback メソッドを使ってコールバックを登録できます。

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

上記の例では "mycb01" という名前でコールバックを登録しています。コールバックを登録すると、サーバーとクライアントの間の通信が直ちに開始されます。DSCallbackChannelManager は、バックグラウンドでサーバーからのイベントが到着するのを待ち、イベントが発生するたびにコールバックを実行します。

接続は、アプリケーションで切断するかサーバーから切断されるまでは、開いたままになります。接続を切断するには、次のように、コールバックの登録を解除してチャネルを閉じます。

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

関連項目