在使用React Native進行跨平臺開發過程當中,或多或少須要涉及到原生開發,這裏主要說一下如何橋接原生 iOS 以及 Android,在此以獲取 APP 版本號爲例。java
iOS 橋接比較簡單,只須要建立一個 Module 類,實現 RCTBridgeModule 協議就好。 首先咱們須要建立一個 RNBridgeManager 類react
RNBridgeManager.h 中的代碼:android
#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
@interface RNBridgeManager : NSObject <RCTBridgeModule>
@end
複製代碼
而後在 RNBridgeManager.m 中實現相應方法react-native
爲了實現 RCTBridgeModule 協議,你的類須要包含 RCT_EXPORT_MODULE()宏。這個宏也能夠添加一個 指定參數用來指定在使用 Javascript 中訪問這個模塊的名字bash
RNBridgeManager.m 中的代碼app
#import "RNBridgeManager.h"
@implementation RNBridgeManager
@synthesize bridge = _bridge;
RCT_EXPORT_MODULE(ToolModule);
// 對外提供調用方法,Callback
RCT_EXPORT_METHOD(getAppVersion:(RCTResponseSenderBlock)callback)
{
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];//獲取項目版本號
callback(@[[NSNull null],version]);
}
@end
複製代碼
最後在RN中調用ide
import React, { Component } from 'react';
import { NativeModules } from 'react-native';
var iOSToolModule = NativeModules.ToolModule;
export default class Me extends Component {
constructor(props) {
super(props);
this.state = {
version: '',
}
this.getVerSion();
}
// 獲取版本號
getVerSion() {
iOSToolModule.getAppVersion((error,event)=>{
if(error){
console.log(error)
}else{
this.setState({
version:event
})
}
})
}
}
複製代碼
至此,iOS 部分的橋接工做就所有完成了。ui
Android 相對 iOS 較爲複雜,咱們首先須要在 Android/app/src/main/java/com 文件夾下新建一個 reactnative 文件夾,在該文件夾下建立 RNBridgeManager.java 文件以及RNReactPackage.java 文件,具體代碼以下:this
RNBridgeManager.java 中的代碼spa
package com.reactnative;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.uimanager.IllegalViewOperationException;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
public class RNBridgeManager extends ReactContextBaseJavaModule {
public RNBridgeManager(ReactApplicationContext reactContext) {
super(reactContext);
}
// 重寫getName方法聲明Module類名稱,在RN調用時用到
@Override
public String getName() {
return "BridgeManager";
}
// 聲明的方法,外界調用
@ReactMethod
public void getAppVersion(Callback successCallback) {
try {
PackageInfo info = getPackageInfo();
if(info != null){
successCallback.invoke(info.versionName);
}else {
successCallback.invoke("");
}
} catch (IllegalViewOperationException e){
}
}
// 獲取 APP 信息
private PackageInfo getPackageInfo(){
PackageManager manager = getReactApplicationContext().getPackageManager();
PackageInfo info = null;
try{
info = manager.getPackageInfo(getReactApplicationContext().getPackageName(),0);
return info;
}catch (Exception e){
e.printStackTrace();
}finally {
return info;
}
}
}
複製代碼
RNReactPackage.java 中的代碼
package com.reactnative;
import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class RNReactPackage implements ReactPackage {
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
@Override
public List<NativeModule> createNativeModules(
ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
// 添加一個安卓原生的activity模塊
modules.add(new RNBridgeManager(reactContext));
return modules;
}
}
複製代碼
而後在 MainApplication.java 中添加剛剛註冊過的包名
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new RNReactPackage()
);
}
複製代碼
最後,在RN中調用
import React, { Component } from 'react';
import { NativeModules } from 'react-native';
export default class Me extends Component {
constructor(props) {
super(props);
this.state = {
version: '',
}
this.getVerSion();
}
// 獲取版本號
getVerSion() {
NativeModules.BridgeManager.getAppVersion((event) =>{
this.setState({
version:event
})
});
}
複製代碼