私はReact NativeでgRPCを使用しようとしています。 まず、Objective-CでgRPCモジュールをセットアップできました。 次に、そのgRPCモジュール用のネイティブモジュールを作成しました。React Native(RCT_REMAP_METHOD):パラメータと戻り値を持つメソッドをエクスポートするにはどうすればいいですか?
gRPCモジュールは非常に簡単です。
rpc CheckEmail(EmailCheckRequest) returns (EmailCheckResponse) {}
message EmailCheckRequest {
string email = 1;
}
message EmailCheckResponse {
common.RetCode ret = 1;
}
ご覧のとおり、1つの入力パラメータ(電子メールアドレス)があり、「リターンコード」が返されます。
https://facebook.github.io/react-native/docs/native-modules-ios.htmlでネイティブモジュールを作成する方法を確認しました。戻り値の付いたモジュールまたはモジュールを作成する方法を示していますが、両方でモジュールを作成する方法は説明していません。
ここに例があります。 (約束と実際に、)パラメータ戻り値と
RCT_EXPORT_METHOD(addEvent:(NSString *)name)
{
RCTLogInfo(@"Pretending to create an event %@", name);
}
モジュールと
モジュールは
RCT_REMAP_METHOD(findEvents,
findEventsWithResolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
{
NSArray *events = ...
if (events) {
resolve(events);
} else {
NSError *error = ...
reject(@"no_events", @"There were no events", error);
}
}
はとにかく、これに基づいて、私はこのように自分のコードを作りました。
RCT_REMAP_METHOD(checkEmail: (NSString *)email, resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
{
/* ... */
}
反応しやすいサイドのJavaScriptコードは、このようなものです。 var NetworkService = NativeModules.NetworkService; var ret = NetworkService.checkEmail('[email protected] ');アプリを実行している間は、コンパイルエラーがなかった
は、しかし、XcodeはRCT_REMAP_METHOD線 「com.facebook.React.JavaScript(11)で、このランタイムエラーを返す:EXC_BAD_ACCESS(=コード= 1、アドレス0x88)
それはRCT_REMAP_METHODマクロに問題があるように見えますが、Objective-Cの詳細を知らないとマルコを使用する方法がわからない。
をモジュールをエクスポートするRCT_REMAP_METHODマクロを使用する方法を知っている人がある場合にはパラメータと戻り値を使用するか、コードに問題がある場合はお知らせください。
追加の発見 私はRCT_REMAP_METHODの定義に従っていましたが、代わりにRCT_EXPORT_METHODを使用するのが良いと思われます。EXPORTはREMAPの再定義であり、EXPORTでの約束の例がありますが、これを行う。
* ## Promises
*
* Bridge modules can also define methods that are exported to JavaScript as
* methods that return a Promise, and are compatible with JS async functions.
*
* Declare the last two parameters of your native method to be a resolver block
* and a rejecter block. The resolver block must precede the rejecter block.
*
* For example:
*
* RCT_EXPORT_METHOD(doSomethingAsync:(NSString *)aString
* resolver:(RCTPromiseResolveBlock)resolve
* rejecter:(RCTPromiseRejectBlock)reject
* { ... }
*
* Calling `NativeModules.ModuleName.doSomethingAsync(aString)` from
* JavaScript will return a promise that is resolved or rejected when your
* native method implementation calls the respective block.
*
*/