EXC_BAD_ACCESS, когда получить значение статической переменной NSString в классе наследовать RCTEventEmitter - PullRequest
0 голосов
/ 01 июня 2019

Я строю реагирую на родном языке, используя собственный модуль В части javascript я хочу создать собственный модуль на iOS для события слушателя и вызвать некоторый метод со стороны javascript. У меня есть статическая переменная NSDictionary в Objective C. Но когда я получаю значение переменной, он показывает EXC_BAD_ACCESS. Я строю реагировать родной, используя родной модуль. В части javascript я хочу создать собственный модуль на iOS для события слушателя и вызвать некоторый метод со стороны javascript. Вот мой код

DeepLinkController.js

import React, {Component} from 'react';
import {Platform, Linking, View, NativeModules, NativeEventEmitter} from 'react-native'
const DeeplinkManager = new NativeEventEmitter(NativeModules.DeeplinkManager);
const TestMethod = NativeModules.TestMethod;

class DeepLinkController extends Component{
  componentDidMount(){
    TestMethod.notifyAppMount();
    DeeplinkManager.addListener('DeepLink', this.handleDeepLink);
  }

  componentWillUnmount(){
    TestMethod.notifyAppUnMount();
    DeeplinkManager.removeListener('DeepLink', this.handleDeepLink);
  }

  handleDeepLink = (event) => {
    //navigate url
  }

  render(){
  }
}

В Objective-C я создаю: DeeplinkManager.h, DeeplinkManager.m, TestMethod.h, TestMethod.m

DeeplinkManager.h
#if __has_include("RCTEventEmitter.h")
#import "RCTEventEmitter.h"
#else
#import <React/RCTEventEmitter.h>
#endif


NS_ASSUME_NONNULL_BEGIN

static bool isAppMount = false, isNavigateNotitication = false;
static NSMutableDictionary<NSMutableString *, id> *resultTemp;


@interface DeeplinkManager : RCTEventEmitter <RCTBridgeModule>

+ (void)notifyAppMount;
+ (void)notifyAppUnMount;
+ (void)emitEventWithDeeplink:(NSString *)deeplink andPayload:(NSDictionary *)payload;
@end

NS_ASSUME_NONNULL_END



#import "DeeplinkManager.h"

@implementation DeeplinkManager
RCT_EXPORT_MODULE();

- (void)startObserving
{
  [[NSNotificationCenter defaultCenter] addObserver:self
                                           selector:@selector(sendDeeplink:)
                                               name:@"Deeplink"
                                             object:nil];
}

- (void)stopObserving
{
  [[NSNotificationCenter defaultCenter] removeObserver:self];
}


- (void)sendDeeplink:(NSNotification *)notifcation {
  NSDictionary<NSString *, id> *payload = @{@"deeplink": notifcation.userInfo[@"deeplink"],@"userInfo":notifcation.userInfo[@"userInfo"]};
  [self sendEventWithName:@"Deeplink" body:payload];
}

+ (void)emitEventWithDeeplink:(NSString *)deeplink andPayload:(NSDictionary *)payload {
    isNavigateNotitication = true;
    resultTemp = @{@"deeplink": deeplink,@"userInfo":payload};
}

RCT_EXPORT_METHOD(getInitialDeeplink:(RCTPromiseResolveBlock)resolve
                  reject:(__unused RCTPromiseRejectBlock)reject)
{
    //some code for handle get initial deeplink
}


+(void)notifyAppMount {
    NSDictionary<NSString *, id> *userInfo = resultTemp;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"SMTDeeplink"
                                                        object:self
                                                      userInfo:userInfo];
  }
}

+(void)notifyAppUnMount {
  isAppMount = false;
}

@end

---TestMethod.h
#import <React/RCTBridgeModule.h>
@interface TestMethod : NSObject <RCTBridgeModule>
@end

--- TestMethod.m
#import "TestMethod.h"
#import "DeeplinkManager.h"
@implementation TestMethod

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(notifyAppMount)
{
 [DeeplinkManager notifyAppMount];
}

RCT_EXPORT_METHOD(notifyAppUnMount)
{
  [DeeplinkManager notifyAppUnMount];
}
@end

Когда мое приложение монтируется, оно вызывает TestMethod.notifyAppMount. Затем я нажимаю уведомление, оно устанавливает параметры в переменную resultTemp. Когда я вызываю TestMethod.notifyAppMount () при нажатии кнопки, этот код показывает: EXC_BAD_ACCESS.

+(void)notifyAppMount {
    NSDictionary<NSString *, id> *userInfo = resultTemp;
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Deeplink"
                                                        object:self
                                                      userInfo:userInfo];
  }
}

В javascriptside я также не могу вызвать DeeplinkManager.getInitialDeeplink (), хотя в модуле deeplink я объявляю метод. Заранее спасибо.

...