2016-02-04 9 views
6

Nella mia app React nativa, sto tentando di inviare eventi da codice nativo a JavaScript in AppDelegate. Per fare questo chiamo:React Native - Invio di eventi da Nativo a JavaScript in AppDelegate (iOS)

[self.bridge.eventDispatcher sendAppEventWithName:@"EventReminder" 
              body:@{@"name": eventName}]; 

Nella mia app delegato. Naturalmente per fare questo ho bisogno di importare:

importazione "RCTBridge.h"

importazione "RCTEventDispatcher.h"

e sintetizzare il ponte

@synthesize bridge = _bridge; 

Ma evento dopo questo, la variabile bridge non esiste. Per fare questo errore andare via ho fatto il mio AppDelegate conforme al protocollo RCTBridgeModule in questo modo:

AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeModule> 

E poi nel mio AppDelegate.m, ho fatto:

RCT_EXPORT_MODULE() 

Dopo tutto quello che il mio ponte è finalmente non errore, ma ogni volta che lo uso in AppDelegate, è nullo.

Dove sto andando male?

Grazie in anticipo.

risposta

13

RCTBridge crea nuove istanze di ogni classe di modulo all'avvio, quindi quando esporti AppDelegate come modulo bridge, stai dicendo al bridge di creare un nuovo AppDelegate e assegnargli un'istanza di bridge.

iOS crea anche un'istanza di AppDelegate all'avvio dell'applicazione, ma l'istanza creata da iOS non è la stessa istanza creata da RCTBridge.

Quindi, in pratica, esistono due istanze di AppDelegate: quella a cui si sta tentando di accedere a self.bridge da, che non è stata creata da RCTBridge e quindi non ha un riferimento ad essa e quella creata da RCTBridge, che ha un bridge, ma non è il delegato per la tua applicazione UIA e non sta eseguendo il tuo codice.

avete alcune opzioni:

1) si poteva passare l'istanza AppDelegate nel ponte quando lo si crea utilizzando il metodo extraModules del RCTBridgeDelegate. Questo ti permette di dire al bridge di usare un'istanza esistente di un modulo, invece di crearne uno nuovo.

2) è possibile accedere al bridge tramite RCTRootView invece di rendere AppDelegate in un modulo in modo che venga fornita una proprietà self.bridge.

3) Spostare la logica che deve comunicare con il bridge da AppDelegate in un nuovo modulo. Se deve essere attivato da un evento all'interno di AppDelegate, utilizzare NSNotifications per comunicare con l'istanza del modulo (utilizzeremo questo modello per RCTPushNotificationManager).

di queste opzioni,

opzione 1) è probabilmente il più complicato da fare in modo corretto.

L'opzione 2) è probabilmente la più semplice da eseguire perché presumibilmente è già presente un'istanza di RCTRootView in AppDelegate a cui è possibile fare riferimento.

L'opzione 3) è l'ideale dal punto di vista tecnico, poiché impedisce di inviare accidentalmente eventi prima che il bridge sia inizializzato correttamente (che potrebbe bloccarsi o comportarsi in modo imprevisto).

+0

Grazie per la risposta dettagliata! Questo ha risposto alla mia domanda !! – coldbuffet

+0

Avete qualche codice di esempio per un principiante !? Sto cercando di inviare un evento per reagire nativo da - - (void) applicationWillEnterForeground: (UIApplication *) application {'e' - (void) applicationDidEnterBackground: (applicazione UIApplication *) { ' – pomo

+0

@pomo Per opzione 3. Have uno sguardo all'implementazione reattiva nativa di AppState https://github.com/facebook/react-native/blob/master/React/Modules/RCTAppState.m –

1

In alternativa è possibile utilizzare NSNotificationCenter.

Ad esempio per elaborare notifiche push entranti AppDelegate

didReceiveRemoteNotification: 

palo un NSNotification. Osservare questa NSNotifica per nome in una sottoclasse di RCTEventEmitter. Quindi chiamare

[self sendEventWithName:@"eventName" body:eventBody]; 

nel rispettivo selettore.

Vedi: Send and receive messages through NSNotificationCenter in Objective-C?

Problemi correlati