返回

React Native 携手原生 iOS/Android 轻松获取 APP 版本号

IOS

  1. 从 React Native 到 iOS
    在 iOS 中,我们需要创建一个继承自 RCTBridgeModule 的类,负责处理通信。下面是代码示例:
#import <React/RCTBridgeModule.h>

@interface RCTMyAppModule : NSObject <RCTBridgeModule>
@end

@implementation RCTMyAppModule

RCT_EXPORT_MODULE();

RCT_EXPORT_METHOD(getAppVersion:(RCTPromiseResolveBlock)resolve
                  rejecter:(RCTPromiseRejectBlock)reject)
{
  NSString *version = [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"];
  resolve(version);
}

@end

为了使用此模块,需要在 AppDelegate.m 中进行注册:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions];
  RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"RCTMyApp" initialProperties:nil];
  self.window.rootViewController = [[UIViewController alloc] initWithNibName:nil bundle:nil];
  self.window.rootViewController.view = rootView;
  [self.window makeKeyAndVisible];
  return YES;
}

- (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge
{
  return @[[RCTMyAppModule new]];
}

最后,在 React Native 代码中,我们就可以调用此方法了:

import { NativeModules } from 'react-native';

const { RCTMyAppModule } = NativeModules;

RCTMyAppModule.getAppVersion().then(version => {
  console.log(`APP 版本号:${version}`);
});

2. 从 React Native 到 Android

在 Android 中,我们需要创建一个 Java 类,实现 ReactContextBaseJavaModule 和 Promise 接口。代码示例如下:

import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

public class RCTMyAppModule extends ReactContextBaseJavaModule {

  public RCTMyAppModule(ReactApplicationContext reactContext) {
    super(reactContext);
  }

  @Override
  public String getName() {
    return "RCTMyAppModule";
  }

  @ReactMethod
  public void getAppVersion(Promise promise) {
    String version = BuildConfig.VERSION_NAME;
    promise.resolve(version);
  }
}

为了使用此模块,需要在 MainApplication.java 中进行注册:

public class MainApplication extends Application implements ReactApplication {

  private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
        new MainReactPackage(),
        new RCTMyAppPackage()
      );
    }
  };

  @Override
  public ReactNativeHost getReactNativeHost() {
    return mReactNativeHost;
  }
}

最后,在 React Native 代码中,我们也可以调用此方法了:

import { NativeModules } from 'react-native';

const { RCTMyAppModule } = NativeModules;

RCTMyAppModule.getAppVersion().then(version => {
  console.log(`APP 版本号:${version}`);
});

3. 常见问题

3.1 如何处理异步调用?

在 iOS 中,可以使用 RCTPromiseResolveBlock 和 RCTPromiseRejectBlock 来处理异步调用。在 Android 中,可以使用 Promise 接口来实现异步调用。

3.2 如何处理错误?

在 iOS 中,可以使用 RCTPromiseRejectBlock 来处理错误。在 Android 中,可以使用 Promise 接口的 reject 方法来处理错误。

4. 总结

本文详细讲解了如何在 React Native 中桥接原生 iOS 和 Android,并以获取 APP 版本号为例,向您展示了具体步骤和代码示例。希望本文对您有所帮助,如果您有任何问题,欢迎随时留言。