Это руководство довольно хорошо объясняет, как настроить собственный модуль с помощью Swift.Он разбивает все на шаги, и за ним довольно легко следить.
https://teabreak.e -spres-oh.com / swift-in-response-native-the-ultimate-guide-part-1-modules-9bb8d054db03
- Настройка
- Как открыть класс Swift для JS
- Как предоставить статические данные Swift
- Как открыть метод Swift
- Как открытьметод с обратным вызовом
- Как выставить метод в качестве Обещания
- Как выставить Emitter Event
- Как извлечь свой React Native Module
Очевидно, что это шаг 6, который вы хотите сделать.
Вот пример кода.Это очень похоже на то, что сделано в приведенной выше ссылке.Заголовок моста должен выглядеть следующим образом:
// <ProjectName>-Bridging-Header.h
#import "React/RCTBridgeModule.h"
#import "React/RCTEventEmitter.h"
У вас должны быть файлы с именами ModuleName.m
и ModuleName.swift
.
// ModuleName.m
#import "React/RCTBridgeModule.h"
#import "React/RCTEventEmitter.h"
@interface RCT_EXTERN_MODULE(ModuleName, NSObject)
// this is how we expose the promise to the javascript side.
RCT_EXTERN_METHOD(functionWithPromise: (RCTPromiseResolveBlock)resolve rejecter: (RCTPromiseRejectBlock)reject)
@end
// ModuleName.swift
@objc(ModuleName)
class ModuleName: NSObject {
@objc
func constantsToExport() -> [AnyHashable : Any]! {
return ["projectName": "ModuleName"]
}
@objc
static func requiresMainQueueSetup() -> Bool {
return true
}
@objc
func functionWithPromise(
_ resolve: RCTPromiseResolveBlock,
rejecter reject: RCTPromiseRejectBlock
) -> Void {
if (//something bad happens) {
let error = NSError(domain: "", code: 200, userInfo: nil)
reject("ERROR_FOUND", "failure", error)
} else {
resolve("success")
}
}
}
Затем на стороне Javascript вы можете получить к нему доступ следующим образом:
import { NativeModules } from 'react-native'
NativeModules.Counter.functionWithPromise()
.then(res => console.log(res))
.catch(e => console.log(e.message, e.code))