تكرار السؤال: …
الإجابة المختصرة
بإنشاء فئة Swift تحتوي على الدوال المرغوبة، واستخدام ملف جسر Objective-C (Bridging Header) وماكرو RCT_EXTERN_MODULE لتسجيلها في شجرة وحدات React Native.
الشرح
نظرًا لأن نواة React Native القديمة تعتمد على Objective-C، فإن ربط كود Swift يتطلب كتابة ملف Objective-C صغير لتصدير الفئة والدوال باستخدام RCT_EXTERN_MODULE و RCT_EXTERN_METHOD، مع تحديد ما إذا كانت الوحدة تتطلب التنفيذ على الـ Main Queue أو خيط منفصل. هذا الأسلوب خاص بالمعمارية القديمة؛ أما في المشاريع الجديدة فيُفضَّل Turbo Native Modules مع Codegen.
مثال بالكود
// Swift file:
@objc(BatteryModule)
class BatteryModule: NSObject {
@objc(getBatteryLevel:rejecter:)
func getBatteryLevel(resolve: RCTPromiseResolveBlock, reject: RCTPromiseRejectBlock) {
resolve(UIDevice.current.batteryLevel * 100)
}
}
// Objective-C file that exports it (BatteryModule.m):
#import <React/RCTBridgeModule.h>
@interface RCT_EXTERN_MODULE(BatteryModule, NSObject)
RCT_EXTERN_METHOD(getBatteryLevel:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
@endأخطاء شائعة
- نسيان إضافة علامة @objc قبل الفئات والدوال في Swift مما يمنع محرك Objective-C من رؤيتها.