React Native 调用 iOS 原生方法

57 阅读1分钟

背景

如何使用原生提供的服务,给用户提供更好的体验和复用端上原有功能

如何实现React调用 swift

步骤 1. create native module

//  ReactSwiftDemo
//  Created by alex on 2025/9/22.

import Foundation
import React

@objc(MyNativeModule)
class MyNativeModule: NSObject, RCTBridgeModule {
  @objc
  static func moduleName() -> String! {
    return "MyNativeModule"
  }
  @objc
  static func requiresMainQueueSetup() -> Bool {
    return false
  }
  
  @objc
  func sayHello(_ name: String) {
    print("Hello, \(name)!")
  }
}

image.png

步骤2. provide a header file for native module

// MyNativeModule.m
#import <React/RCTBridgeModule.h>

@interface RCT_EXTERN_MODULE(MyNativeModule, NSObject)
RCT_EXTERN_METHOD(sayHello:(NSString *)name)
@end

步骤 3. use your native module

image.png

<Button title="say hello" onPress={() => {
  MyNativeModule.sayHello("123");
}} />

如何获取swift 的返回结果

答案:

  • callback: RCTResponseSenderBlock, 或者
  • resolver: RCTPromiseResolveBlock
  • rejecter: RCTPromiseRejectBlock

image.png

// 计算两个数的和 - 使用 Callback
  @objc
  func calcAsync(_ a: Int, b: Int, callback: @escaping RCTResponseSenderBlock) {
    // 在异步线程中计算
    DispatchQueue.global().async {
      let result = a + b
      callback([result])
    }
  }
// MyNativeModule.m
#import <React/RCTBridgeModule.h>

@interface RCT_EXTERN_MODULE(MyNativeModule, NSObject)
RCT_EXTERN_METHOD(sayHello:(NSString *)name)
RCT_EXTERN_METHOD(calcAsync:(NSInteger)a b:(NSInteger)b callback:(RCTResponseSenderBlock)callback)
@end
MyNativeModule.calcAsync(1, 2, (result: any) => {
    console.log('result', result);
});