RPC 関連のモジュールは `APMobileNetwork.framework` と `MPMgsAdapter` です。`MPMgsAdapter` のインターフェイスを使用できます。
このトピックでは、Mobile Gateway Service のソフトウェア開発キット (SDK) を使用するための手順について説明します:
ゲートウェイサービスの初期化
次のメソッドを呼び出して、ゲートウェイサービスを初期化できます:
[MPRpcInterface initRpc];旧バージョンからのアップグレードに関する注意事項
バージョン 10.1.32 以降、ミドル層が meta.config から構成を読み取るため、DTRpcInterface クラスの Category ファイルを追加する必要はありません。スペックアップ後は、プロジェクト内の以前のバージョンからの構成を確認し、それらを削除してください。以下のイメージには、削除する必要がある DTRpcInterface クラスの Category ファイルが示されています。

RPC コードの生成
ご利用のアプリが Mobile Gateway Service コンソールでバックエンドサービスに接続した後、クライアント側の RPC コードをダウンロードできます。詳細については、「コードの生成」をご参照ください。
ダウンロードされた RPC コードは次の構造になっています:

ここで、
RPCDemoCloudpay_accountClientは RPC 構成です。RPCDemoAuthLoginPostReqはリクエストモデルです。RPCDemoLoginResultは応答モデルです。
リクエストの送信
中間レイヤーの MPRpcInterface にカプセル化されたサブスレッド呼び出しインターフェイスを使用して、サブスレッドで RPC リクエストを呼び出すことができます。コールバックメソッドはデフォルトでメインスレッドで実行されます。次のコードはその例を示しています。
- (void)sendRpc
{
__block RPCDemoLoginResult *result = nil;
[MPRpcInterface callAsyncBlock:^{
@try
{
RPCDemoLoginRequest *req = [[RPCDemoLoginRequest alloc] init];
req.loginId = @"alipayAdmin";
req.loginPassword = @"123456";
RPCDemoAuthLoginPostReq *loginPostReq = [[RPCDemoAuthLoginPostReq alloc] init];
loginPostReq._requestBody = req;
RPCDemoCloudpay_accountClient *service = [[RPCDemoCloudpay_accountClient alloc] init];
result = [service authLoginPost:loginPostReq];
}
@catch (NSException *exception) {
NSLog(@"%@", exception);
NSError *error = [userInfo objectForKey:@"kDTRpcErrorCauseError"]; // 詳細な例外情報を取得
NSInteger code = error.code; // 詳細な例外情報からエラーコードを取得
}
} completion:^{
NSString *str = @"";
if (result && result.success) {
str = @"Logon successful";
} else {
str = @"Logon failed";
}
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:str message:nil delegate:nil
cancelButtonTitle:nil otherButtonTitles:@"ok", nil];
[alert show];
}];
}例外をキャッチするには、
try catchを使用します。ゲートウェイが異常な場合、例外がスローされます。原因については、「ゲートウェイの結果コード」をご参照ください。RPC Swift では、
try catchを使用して例外をキャッチできません。詳細については、「Swift での Objective-C 例外の安全な処理」をご参照ください。
Swift での Objective-C 例外の安全な処理
背景情報
Swift のエラー処理メカニズム(do-catch)は、Objective-C の例外処理メカニズム(@try-@catch)と低レベルで異なります。その結果、Swift コードは Objective-C コードによってスローされた NSException を直接キャッチできません。これにより、マルチ言語プログラミング環境でアプリケーションがクラッシュする可能性があります。
ソリューション
この問題を解決し、アプリケーションの安定性を確保するために、APRpcExceptionCatch ツールを使用できます。その safeExecuteTry メソッドは、Objective-C の @try-@catch ロジックをカプセル化しています。これにより、Swift 環境で安全に RPC 呼び出しを実行できます。
Objective-C コードが実行中に例外をスローした場合、safeExecuteTry がそれをキャッチし、DTRpcException オブジェクトとして返します。コードが正常に実行された場合、nil を返します。
バージョン
ベースラインバージョン 10.2.3.66 以降でサポートされています。
サンプルコード
import MBProgressHUD
import APMobileNetwork
private func performGetIdRpcCall() {
// 1. ローディングインジケーターを表示します (元の executeRpc の開始)。
MBProgressHUD.showAdded(to: self.view, animated: true)
// 2. 結果とエラーを受け取るための変数を定義します。
var response: MPDemoUserInfo? // ジェネリック型 T を特定の型 MPDemoUserInfo に置き換えます。
var rpcError: DTRpcException?
// 3. RPC 呼び出しを非同期に実行します (元の DTRpcAsyncCaller.callAsyncBlock)。
DTRpcAsyncCaller.callAsyncBlock({
// 3.1. バックグラウンドスレッドで実際の RPC 呼び出しを安全に実行します。
rpcError = APRpcExceptionCatch.safeExecuteTry {
// これは元の 'call' クロージャの内容です。
let client = MPDemoRpcDemoClient()
// 結果を response 変数に割り当てます。
response = client.getIdGet(self.getRequest())
}
}, completion: {
// 4. メインスレッドで完了ロジックを処理します。
DispatchQueue.main.async {
// 4.1. ローディングインジケーターを非表示にします。
MBProgressHUD.hide(for: self.view, animated: true)
// 4.2. RPC 呼び出しにエラーがあるかどうかを確認します。
if let exception = rpcError {
// エラーがある場合は、エラーメッセージを構築して表示します。
var errorMsg: String
if exception.code.rawValue == 0 {
if let realError = exception.userInfo?["kDTRpcErrorCauseError"] as? NSError {
let errorString = "Error: [Domain: \(realError.domain), Code: \(realError.code), Description: \(realError.localizedDescription)]"
errorMsg = "Rpc Exception: \(errorString)"
} else {
let cause = exception.userInfo?["kDTRpcErrorCauseError"]
errorMsg = "Rpc Exception code: \(exception.code), no real error: \(cause ?? "nil")"
}
} else {
errorMsg = "Rpc Exception code: \(exception.code)"
}
// エラートーストを表示します。
self.showErrorToast(message: errorMsg)
} else {
// 4.3. 呼び出しが成功した場合は、返されたデータを処理します。
// これは元の 'success' クロージャの内容です。
self.showAlert(title: "Returned Data", message: response?.description)
}
}
})
}
リクエスト構成のカスタマイズ
DTRpcMethod は、RPC リクエストメソッドを表します。この要素は、メソッド名、パラメーター、および戻り値の型など、リクエストの情報を記録します。
リクエストを送信する際に署名を追加する必要がない場合は、
signCheckプロパティをDTRpcMethodのプロパティとして NO に設定します。-(MPDemoUserInfo *) dataPostSetTimeout:(MPDemoPostPostReq *)requestParam { DTRpcMethod *method = [[DTRpcMethod alloc] init]; method.operationType = @"com.antcloud.request.post"; method.checkLogin = NO ; method.signCheck = NO ; method.returnType = @"@\"MPDemoUserInfo\""; return [[DTRpcClient defaultClient] executeMethod:method params:@[ ]]; }タイムアウト期間を設定するには、
timeoutIntervalプロパティをDTRpcMethodのものとして設定します。-(MPDemoUserInfo *) dataPostSetTimeout:(MPDemoPostPostReq *)requestParam { DTRpcMethod *method = [[DTRpcMethod alloc] init]; method.operationType = @"com.antcloud.request.post"; method.checkLogin = NO ; method.signCheck = YES ; method.timeoutInterval = 1; // このタイムアウト期間は、クライアントがゲートウェイから応答を受信するまでの時間です。サーバー側のタイムアウト期間は、バックエンドの業務システムから応答が返されるまでの時間です。デフォルト値は 20 秒です。1 未満の値は無効であり、デフォルト値が使用されます。 method.returnType = @"@\"MPDemoUserInfo\""; return [[DTRpcClient defaultClient] executeMethod:method params:@[ ]]; }インターフェイスにヘッダーを追加するには、次の
DTRpcClientの拡張メソッドを使用します。-(MPDemoUserInfo *) dataPostAddHeader:(MPDemoPostPostReq *)requestParam { DTRpcMethod *method = [[DTRpcMethod alloc] init]; method.operationType = @"com.antcloud.request.postAddHeader"; method.checkLogin = NO ; method.signCheck = YES ; method.returnType = @"@\"MPDemoUserInfo\""; // インターフェイスのヘッダーを追加 NSDictionary *customHeader = @{@"testKey": @"testValue"}; return [[DTRpcClient defaultClient] executeMethod:method params:@[ ] requestHeaderField:customHeader responseHeaderFields:nil]; }すべてのインターフェイスにヘッダーを追加するには、インターセプターを使用できます。詳細については、Mobile Gateway Service のコードサンプルをご参照ください。
checkLoginプロパティは、インターフェイスsessionの検証に使用されます。この検証には、ゲートウェイ コンソールでの構成が必要です。デフォルトでは、このプロパティは NO に設定されています。
RPC インターセプターのカスタマイズ
RPC リクエストが送信される前または処理された後にロジックを処理する必要がある場合があります。RPC モジュールは、この目的のためにインターセプターメカニズムを提供します。
インターセプターのカスタマイズ
インターセプタを作成し、<DTRpcInterceptor> プロトコルのメソッドを実装することで、RPC リクエストの前後で操作を処理できます。
@interface HXRpcInterceptor : NSObject<DTRpcInterceptor>
@end
@implementation HXRpcInterceptor
- (DTRpcOperation *)beforeRpcOperation:(DTRpcOperation *)operation{
// TODO
return operation;
}
- (DTRpcOperation *)afterRpcOperation:(DTRpcOperation *)operation{
// TODO
return operation;
}
@endインターセプターの登録
中間レイヤーの拡張インターフェイスを呼び出して、インターセプターコンテナーにカスタムサブインターセプターを登録できます。
HXRpcInterceptor *mpTestIntercaptor = [[HXRpcInterceptor alloc] init]; // カスタムサブインターセプター
[MPRpcInterface addRpcInterceptor:mpTestIntercaptor];データの暗号化
RPC は、複数のデータ暗号化構成機能を提供します。詳細については、「データの暗号化」をご参照ください。