When no JS library covers a need (e.g. a native secure enclave signing API), you write a native module: platform code exposing methods that JavaScript can call asynchronously.
// iOS (Swift, simplified)
@objc(SecureSigner)
class SecureSigner: NSObject {
@objc func sign(_ message: String, resolver: @escaping RCTPromiseResolveBlock, rejecter: @escaping RCTPromiseRejectBlock) {
// ... platform signing logic ...
resolver(signatureHex)
}
}// JS side
import { NativeModules } from "react-native";
const { SecureSigner } = NativeModules;
const sig = await SecureSigner.sign("hello");The newer architecture (TurboModules + Fabric via JSI) replaces the older async bridge with direct, synchronous-capable JS-to-native calls, reducing serialization overhead for performance-sensitive native code.