1

我需要一个回调函数来侦听本机模块中的某些事件并将数据从本机传输到 javascript,我想直接在 React Native iOS 应用程序中从本机调用此 javascript 函数,而不将事件发送到NativeEventEmitter.

如何使用 JSI(JavaScript 接口)实现这一点?

4

1 回答 1

0

首先,您的函数必须在 javascript 中全局定义,例如:

应用程序.js

global.greeting = function(param) {
    return "Hello " + param + "!";
};

然后你应该在本机中找到并使用 React Native Runtime 调用它:

AppDelegate.mm

#include <jsi/jsi.h>
#import <React/RCTBridge+Private.h>

using namespace facebook::jsi;
using namespace std;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  ...
  
  // Runtime notification
  [NSNotificationCenter.defaultCenter addObserverForName:RCTJavaScriptDidLoadNotification object:nil queue:nil
                                              usingBlock:^(NSNotification* notification) {
    // Get runtime
    RCTCxxBridge* cxxbridge = (RCTCxxBridge*)notification.userInfo[@"bridge"];
    if (cxxbridge.runtime) {
      Runtime& runtime = *(Runtime*)cxxbridge.runtime;
      
      // Get global function
      Function greeting = runtime.global().getPropertyAsFunction(runtime, "greeting");
      
      // Call with param
      Value param = Value(runtime, String::createFromUtf8(runtime, "JSI"));
      Value result = greeting.call(runtime, move(param), 1);
      
      string str = result.asString(runtime).utf8(runtime);
      printf("Result: %s", str.c_str());
    }
  }];
  return YES;
}

输出:

Result: Hello JSI!

注意:由于示例使用 JSI 进行同步本地方法访问,远程调试(例如使用 Chrome)不再可能。相反,您应该使用 Flipper 来调试您的 JS 代码。

于 2022-01-26T15:29:09.497 回答