ネイティブモジュールを使用して反応ネイティブを構築しています。JavaScript側では、iOS上でリスナイベント用のネイティブモジュールを作成し、JavaScript側から何らかのメソッドを呼び出したいと考えています。Objective C に静的な NSDictionary 変数があります。しかし、変数の値を取得すると、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 が呼び出されます。次に、通知をプッシュします。params が resultTemp 変数に設定されます。ボタンを押したときに TestMethod.notifyAppMount() を呼び出すと、次のコードが表示されます: EXC_BAD_ACCESS.
+(void)notifyAppMount {
NSDictionary<NSString *, id> *userInfo = resultTemp;
[[NSNotificationCenter defaultCenter] postNotificationName:@"Deeplink"
object:self
userInfo:userInfo];
}
}
javascript側では、deeplinkモジュールでメソッドを宣言していますが、DeeplinkManager.getInitialDeeplink()も呼び出すことができません。前もって感謝します。