React NativeブリッジオリジナルiOSおよびAndroidアプリバージョン番号
5652 ワード
React Nativeを使用してプラットフォーム間開発を行う過程で、多かれ少なかれオリジナル開発に関わる必要があります.ここでは、オリジナルiOSとAndroidをどのようにブリッジするかを主に説明し、ここではアプリのバージョン番号を取得することを例に挙げます.
iOSブリッジ
iOSブリッジは比較的簡単で、Moduleクラスを作成し、RCTbridgeModuleプロトコルを実装すればよい.まずRNBridgeManagerクラスを作成する必要があります
RNBridgeManager.hのコード:
RNBridgeManagerでmにおける対応する方法の実現
RCTbridgeModuleプロトコルを実装するには、クラスにRCTを含める必要があります.EXPORT_MODULE()マクロ.このマクロは、Javascriptを使用してこのモジュールにアクセスする名前を指定するための指定パラメータを追加することもできます.
RNBridgeManager.mのコード
最後にRNで呼び出す
これでiOS部分のブリッジ作業はすべて完了しました.
Android
AndroidはiOSに比べて複雑ですが、まずAndroid/app/src/main/java/comフォルダの下にreactnativeフォルダを作成し、そのフォルダの下にRNBridgeManagerを作成する必要があります.JAvaファイルおよびRNReactPackage.JAvaファイル、具体的なコードは以下の通りです.
RNBridgeManager.JAvaのコード
RNReactPackage.JAvaのコード
そしてMainApplication.JAvaに登録したばかりのパッケージ名を追加
最後に、RNで呼び出す
注意事項 iOSブリッジの場合、漏れないように@synthesize bridge=bridge; Androidブリッジの場合、露出の仕方は前に@ReactMethod を付ける必要があります.関連の機能方法を実現する時、できるだけCallbackの形式を使って、ネット上の多くの文章はreturnの形式を使って、開発の時参考にしたことがあって、しかし に成功していません iOSのRCT_EXPORT_MODULE(ToolModule)およびAndroidでgetNameバインドされた名前、すなわちRN呼び出しのクラス名 AndroidブリッジMainApplicationで対応するPackage をバインドすることを覚えています.
iOSブリッジ
iOSブリッジは比較的簡単で、Moduleクラスを作成し、RCTbridgeModuleプロトコルを実装すればよい.まずRNBridgeManagerクラスを作成する必要があります
RNBridgeManager.hのコード:
#import
#import
@interface RNBridgeManager : NSObject
@end
RNBridgeManagerでmにおける対応する方法の実現
RCTbridgeModuleプロトコルを実装するには、クラスにRCTを含める必要があります.EXPORT_MODULE()マクロ.このマクロは、Javascriptを使用してこのモジュールにアクセスする名前を指定するための指定パラメータを追加することもできます.
RNBridgeManager.mのコード
#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で呼び出す
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部分のブリッジ作業はすべて完了しました.
Android
AndroidはiOSに比べて複雑ですが、まずAndroid/app/src/main/java/comフォルダの下にreactnativeフォルダを作成し、そのフォルダの下にRNBridgeManagerを作成する必要があります.JAvaファイルおよびRNReactPackage.JAvaファイル、具体的なコードは以下の通りです.
RNBridgeManager.JAvaのコード
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 createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
@Override
public List createNativeModules(
ReactApplicationContext reactContext) {
List modules = new ArrayList<>();
// activity
modules.add(new RNBridgeManager(reactContext));
return modules;
}
}
そしてMainApplication.JAvaに登録したばかりのパッケージ名を追加
@Override
protected List getPackages() {
return Arrays.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
})
});
}
注意事項