Wie kann ein natives Modul zu einer internen JavaScript-Methode zurückrufen, dann die interne Methode verarbeiten, zum Beispiel Daten in JSON analysieren und dann ein Ereignis auslösen, das die native App empfängt?Wie schreibe ich ein natives "natives Modul" (Bridge), das gängigen JavaScript-Code wiederverwendet?
Für plattformübergreifende Brückenmodule möchte ich vermeiden, Code in beide Ziel C und Java zu duplizieren. Wenn es möglich ist, möchte ich plattformübergreifenden Brückenmodul-Code in JavaScript schreiben und für Android und iOS wiederverwenden.
Meine aktuelle Lösung:
Dies funktioniert.
- sendEventWithName mit dem "_processResponseInJavaScriptMethod"
- forwardEventWithName sendEventWithName auf die native App reagieren:
Dies wird in zwei Anrufe zu sendEventWithName führen.
Frage:
Gibt es ein Konzept für die native Code-Daten zu verarbeiten synchron einen JS-Call, dann Ergebnisse senden sofort mit sendEventWithName?
Oder benötigt jeder native> JS-Aufruf eine asynchrone _bridge enqueueJSCall
?
Datei: MyNativeModule.m
// Use forwardEventWithName to forward events // processed by common cross-platform JS to the react native app RCT_EXPORT_METHOD(forwardEventWithName:(NSString*)name body:(NSString*)body) { [self sendEventWithName:name body:body]; } // 1 - react native app calls sendQueryToBluetoothDevice // 2 - device calls commandResponse when response received RCT_EXPORT_METHOD(sendQueryToBluetoothDevice:(NSString*)command { [_device sendCommand:command]; } // 1 - Receives XML response from external Bluetooth device // 2 - Sends XML to internal JS method for processing // 3 - Internal JS method uses forwardEventWithName // to send event to react native app - (void) commandResponse:(NSString *) xml { [self sendEventWithName:@"_processResponseInJavaScriptMethod" body:@{@"xml": configuration}]; }
Datei: index.js (native Modul)
// Parse xml in common JS code for both Android and iOS native modules emitter.addListener("_processResponseInJavaScriptMethod", (e) => { const body = parseXml(e.xml); // ?? Is there a way to send event directly using JS to the react native app ?? // Hack - Call native method forwardEventWithName to sendEventWithName to react native app. /// // This makes two _bridge enqueueJSCall's // 1 - One call to sendEventWithName "_myNativeModuleInternalMethod" // 2 - Second call to sendEventWithName "myNativeModuleEvent MyNativeModule.forwardEventWithName( 'myNativeModuleEventResponseReceived', JSON.stringify(body)); } })
Ich habe das native Modul arbeiten. Ich finde gerade, dass ich Code in Java und Objective C vervielfältige, die wiederverwendet werden könnten. Vielleicht ich AddListener in der index.js des bridge-Moduls und dann Callback von nativem Code empfangen, Daten verarbeiten, dann Ereignis ausstrahlen? Reactive-Native-Fetch-Blob erscheint, könnte es so etwas tun? https://github.com/wkh237/react-native-fetch-blob –
Wie Sie es strukturieren, hängt von Ihnen ab. Sie haben Möglichkeiten für native, Informationen an JS und JS zu senden, um Informationen an native zu senden. – satya164
Danke. Gibt es einen Ansatz für nativen Code, um Daten synchron mit einem JS-Aufruf zu verarbeiten, und Ergebnisse sofort mit sendEventWithName zu senden? –