我正在尝试为我的 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 并针对这些异步情况发送类似的事件(如上面所示)?
首先
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' }
});