2016-02-04 13 views
6

मेरे में स्थानीय ऐप प्रतिक्रिया, मैं AppDelegate में जावास्क्रिप्ट को मूल कोड से घटनाओं भेजने की कोशिश कर रहा हूँ। ऐसा करने के लिए मैं कॉल करता हूं:मूल निवासी प्रतिक्रिया - AppDelegate (आईओएस) में जावास्क्रिप्ट को मूल से घटनाओं भेजा जा रहा है

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

मेरे ऐप प्रतिनिधि में। की यह करने के लिए पाठ्यक्रम मैं आयात करने की आवश्यकता:

आयात "RCTBridge.h"

आयात "RCTEventDispatcher.h"

और पुल

@synthesize bridge = _bridge; 

लेकिन घटना के संश्लेषण के बाद, पुल चर मौजूद नहीं है। इस त्रुटि को हटाने के लिए मैं अपने AppDelegate तो जैसे RCTBridgeModule प्रोटोकॉल के अनुरूप बनाया:

AppDelegate : UIResponder <UIApplicationDelegate, RCTBridgeModule> 

और फिर मेरी AppDelegate.m में, मैंने किया था:

RCT_EXPORT_MODULE() 

सब है कि मेरे पुल अंत में हो जाने के बाद त्रुटि नहीं, लेकिन जब भी मैं इसे ऐपडिलेगेट में उपयोग करता हूं, यह शून्य है।

मैं गलत कहां जा रहा हूं?

अग्रिम धन्यवाद। जब यह शुरू होता है

उत्तर

13

RCTBridge प्रत्येक मॉड्यूल वर्ग के नए उदाहरणों बनाता है, इसलिए जब आप एक पुल मॉड्यूल के रूप में अपने AppDelegate निर्यात करते हैं, आप एक नया AppDelegate बनाते हैं, और यह एक पुल उदाहरण देने के लिए पुल को बता रहे हैं।

आईओएस भी AppDelegate का एक उदाहरण से उत्पन्न होने वाला आपके आवेदन की शुरूआत है, लेकिन उदाहरण के आईओएस के द्वारा बनाई गई RCTBridge द्वारा बनाई गई एक ही उदाहरण नहीं है।

तो मूल रूप से, आपके पास ऐपडिलेगेट के दो उदाहरण हैं: जिसकी आप स्वयं सेब्रिज तक पहुंचने का प्रयास कर रहे हैं, जिसे आरसीटीब्रिज द्वारा नहीं बनाया गया था और इसलिए इसका कोई संदर्भ नहीं है, और जिसे बनाया गया है आरसीटीब्रिज, जिसमें एक पुल है, लेकिन यह आपके यूआईपीप्लिकेशंस के प्रतिनिधि नहीं है, और आपका कोड नहीं चला रहा है। जब आप इसे RCTBridgeDelegate के extraModules विधि का उपयोग कर बनाते हैं तो आप पुल में अपने AppDelegate उदाहरण दे सकते हैं

1):

आप कुछ ही विकल्प हैं। यह आपको पुल को एक मॉड्यूल के मौजूदा उदाहरण का उपयोग करने देता है, इसके बजाय पीएफ एक नया बना देता है।

2) यदि आप इतना है कि यह एक self.bridge संपत्ति दिया हो जाता है एक मॉड्यूल में अपने RCTRootView बजाय अपने AppDelegate बनाने के माध्यम से पुल का उपयोग कर सकते हैं।

3) तर्क है कि एक नए मॉड्यूल में AppDelegate से बाहर पुल से बात करने की जरूरत है ले जाएँ। यदि इसे ऐपडिलेगेट के अंदर किसी ईवेंट द्वारा ट्रिगर करने की आवश्यकता है, तो मॉड्यूल इंस्टेंस के साथ संवाद करने के लिए NSNotifications का उपयोग करें (हम RCTPushNotificationManager के लिए इस पैटर्न का उपयोग करते हैं)।

इन विकल्पों में से

,

विकल्प 1) शायद सबसे जटिल सही ढंग से करना है।

विकल्प 2) शायद ऐसा करना सबसे आसान है क्योंकि संभवतः आपके पास पहले से ही आपके ऐपडिलेगेट में RCTRootView का एक उदाहरण है जिसका आप संदर्भ दे सकते हैं।

विकल्प 3) एक तकनीकी परिप्रेक्ष्य से आदर्श है, क्योंकि यह आपको पुल ठीक तरह से शुरू करने से पहले घटनाओं को गलती से भेजने से रोकता है (जो दुर्घटनाग्रस्त हो सकता है, या अप्रत्याशित रूप से व्यवहार कर सकता है)।

+0

विस्तृत प्रतिक्रिया के लिए धन्यवाद! उसने मेरे सवाल का जवाब दिया !! – coldbuffet

+0

क्या आपके पास शुरुआती के लिए कुछ नमूना कोड है !? मैं '- (शून्य) आवेदन से मूल प्रतिक्रिया करने के लिए एक घटना भेजने की कोशिश कर रहा हूं। (एंटरप्राइजेशन *) एप्लिकेशन {' और '- (शून्य) आवेदन डीडइंटरबैकग्राउंड: (यूआईएप्लिकेशंस *) एप्लिकेशन { ' – pomo

+0

@ विकल्प विकल्प के लिए 3p है। प्रतिक्रिया-मूल ऐपस्टेट कार्यान्वयन पर एक नज़र डालें https://github.com/facebook/react-native/blob/master/React/Modules/RCTAppState.m –

1

वैकल्पिक रूप से आप NSNotificationCenter का उपयोग कर सकते हैं।

उदाहरण AppDelegate

में
didReceiveRemoteNotification: 

पोस्ट एक NSNotification भेजे पुश नोटिफिकेशन पर कार्रवाई करने के लिए

। RCTEventEmitter के उप-वर्ग में नाम से इस NSNotification का निरीक्षण करें। फिर संबंधित चयनकर्ता में

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

पर कॉल करें।

देखें: Send and receive messages through NSNotificationCenter in Objective-C?

संबंधित मुद्दे