Pour accéder à l'API native d'iOS, React Natve fournit une API appelée Native Module
.
Cette fois, je vais résumer comment implémenter un module natif avec Swift
.
Si vous n'avez pas encore de projet, créez-en un.
npx react-native init myApp
Ouvrez le projet dans ʻios / myApp.xcodeproj` avec XCode.
Créez un dossier NativeModules
. (Tout)
Créez un fichier .swift
dans le dossier Native Modules
.
Quand vous créez un fichier .swift
, XCode vous demandera si vous voulez créer un ʻObjective-C Bridging Header`.
Ce fichier, comme son nom l'indique, relie le fichier Swift et le fichier ʻObjective-C`. Ne modifiez pas le nom du fichier.
Ajoutez à l '«En-tête de pontage Objective-C» comme suit.
myApp-Bridging-Header.h
// myApp-Bridging-Header.h
#import"React/RCTBridgeModule.h"
Pour commencer, implémentons le module natif le plus simple. Modifiez la valeur du compteur.
Counter.swift
import Foundation@objc(Counter)
class Counter: NSObject {
private var count = 0
@objc
func increment() {
count += 1
print("count is \(count)")
}
}
Créez un fichier ʻObjective-C` pour que la méthode implémentée puisse être gérée depuis React Native.
Créez-le dans le même répertoire avec le même nom que le fichier Swift que vous avez créé précédemment.
Ajoutez ce qui suit au fichier créé.
Counter.m
@interface RCT_EXTERN_MODULE(Counter, NSObject)
RCT_EXTERN_METHOD(increment)
@end
Les méthodes décrites dans RCT_EXTERN_METHOD
peuvent être utilisées dans ReactNative.
Si la méthode n'a pas d'arguments, écrivez comme suit.
RCT_EXTERN_METHOD(methodName)
S'il y a un argument, écrivez comme suit.
RCT_EXTERN_METHOD(
methodName: (paramType1)internalParamName1
)
Par exemple, si la méthode ʻincrement nécessite un argument, le fichier
swift` ressemble à ceci:
@objc
func increment(_ num: Int) {
...
}
Le "RCT_EXTERN_METHOD" correspondant est le suivant.
RCT_EXTERN_METHOD(
increment: (Int)num
)
Vous pouvez importer NativeModules
et l'appeler avec class name.method
.
import { NativeModules } from 'react-native'
NativeModules.Counter.increment(1));
Utilisez RCTEventEmitter
lorsque vous souhaitez Sunscribe les événements qui se produisent du côté iOS natif.
Écrivez ce qui suit dans le fichier ʻObjective-C`.
#import "React/RCTBridgeModule.h"
#import "React/RCTEventEmitter.h"
@interface RCT_EXTERN_MODULE(Counter, RCTEventEmitter)
De plus, ajoutez-le au fichier de pont.
CounterApp-Bridging-Header.h
#import "React/RCTBridgeModule.h"
#import "React/RCTEventEmitter.h"
Implémentez les éléments suivants dans votre fichier Swift:
--sendEvent
: Décrivez le nom de l'événement et son contenu
--supportedEvents
: Décrivez le nom de l'événement lors du collage d'un écouteur du côté React Native
@objc(Counter)
class Counter: RCTEventEmitter {
@objc
func increment() {
count += 1
print("count is \(count)")
sendEvent(withName: "onIncrement", body: ["count": count])
}
override func supportedEvents() -> [String]! {
return ["onIncrement"]
}
}
Du côté ReactNative, l'écouteur d'événements écoute.
import {
NativeModules,
NativeEventEmitter
} from 'react-native'
const CounterEvents = new NativeEventEmitter(NativeModules.Counter);
CounterEvents.addListener(
"onIncrement",
(res) => console.log(res)
);
NativeModules.Counter.increment();
L'avertissement suivant peut apparaître.
Ceci est un avertissement pour définir si le module doit être traité dans le thread principal ou en arrière-plan. Vous pouvez désactiver l'avertissement en écrivant comme suit.
@objc
static func requiresMainQueueSetup() -> Bool {
return true
}
--Retourne true
: traité par le thread principal
--Retourne faux
: traité en arrière-plan
Nous avons résumé comment écrire des modules natifs dans Swift.
Recommended Posts