桥接 React Native 的 Swift 委托

问题描述 投票:0回答:1

我正在尝试为我的 Swift SDK 实现创建对 React Native 的支持。

我的 SDK 的

.initialise()
方法有一个代表成功和失败的委托参数。 尽管我确保将所有公共类和模型转换为 @objc 以实现兼容性,但 React Native 没有委托逻辑,所以我正在寻找替代方案。

第一个选项:将逻辑更改为回调,对于需要运行异步的情况,依赖 NSNotifications?不确定这种方法。

@objc(MySDKBridge)
class MySDKBridge: NSObject {
    @objc func initialise() {
    let myDelegate = InitialiseDelegate()
    MySDK.shared.initialise(delegate: myDelegate)
  }
}

extension MySDKBridge: InitialiseDelegate {
func sendEventToReactNative(name: String, body: [String: Any]) {
    if let bridge = self.bridge {
        bridge.eventDispatcher().sendAppEvent(withName: name, body: body)
    }
}

func initialiseCompleted() {
    sendEventToReactNative(name: "InitialisationCompleted", body: ["status": "success"])
}

func initialiseFailed(message: String) {
    sendEventToReactNative(name: "InitialisationFailed", body: ["status": "failure", "message": message])
}
}

第二个选项:将逻辑更改为回调(我认为 React 会支持),并且可能依赖 NSNotifications 并针对这些异步情况发送类似的事件(如上面所示)?

ios swift react-native sdk bridging-header
1个回答
0
投票

首先

bridge.eventDispatcher().sendAppEvent
已弃用:

'sendAppEvent(withName:body:)' is deprecated: Subclass `RCTEventEmitter` instead

因此,您应该实现

RCTEventEmitter
的纯ObjC子类,如将事件发送到JavaScript中所述,因为React Native不支持开箱即用的Swift。

#import <React/RCTBridgeModule.h>
#import <React/RCTEventEmitter.h>

@interface EventEmitter: RCTEventEmitter <RCTBridgeModule>
@end

@implementation EventEmitter
...
@end

更方便的方法是利用 ReactBridge 库用纯 Swift 制作 Native 模块。例如:

@ReactModule
class EventEmitter: RCTEventEmitter {
  
  static private(set) var shared: EventEmitter?
  
  override init() {
    super.init()
    Self.shared = self
  }
  
  override func supportedEvents() -> [String]! {
    ["EventReminder"]
  }
  
  func sendReminderEvent(title: String) {
    sendEvent(withName: "EventReminder", body: ["title" : title])
  }
}

将您的事件发送到 React Native:

EventEmitter.shared?.sendReminderEvent(title: "Dinner Party")

JS代码:

const { EventEmitter } = NativeModules;

this.eventEmitter = new NativeEventEmitter(EventEmitter);
this.emitterSubscription = this.eventEmitter.addListener('EventReminder', event => {
  console.log(event); // Prints: { title: 'Dinner Party' }
});
© www.soinside.com 2019 - 2024. All rights reserved.