0

React Native 与原生代码混编

jopen 9年前

这两天主要了解了 React Native 的基本使用,以及和原生代码混编的方式,最后写了一个 demo,主要实现了在 JavaScript 代码当中调用 UINavigationController 和自定义的 ViewController 等原生组件的功能。

原生代码混编

我们遇到的问题是:我们要在 React Native 项目当中添加原生实现的 IM 模块(Leanchat-ios)。

React Native 官方文档给出了使用原生代码扩展功能的方法:

首先,IM 模块是一个完整的功能模块而不是一个简单的 UI 组件,很多的功能代码集中在各种 UIViewController 里。React Native 目前是不支持封装 UIViewController,所以,第二种方法不行。

不过,可以使用第一种方式,为 JavaScript 代码封装一个操作 UINavigationController 的接口。除了 IM 部分以外,其他功能采用 React Native 组件实现,当需要跳转到 IM 模块的时候,调用封装的接口将 IM 模块 push 到 navigationController 上即可。

接口代码如下:

#import <UIKit/UIKit.h>  #import <Foundation/Foundation.h>    #import "CDLoginVC.h"  #import "SpringBoard.h"    @implementation SpringBoard    RCT_EXPORT_MODULE();    RCT_EXPORT_METHOD(gotoIM:(RCTResponseSenderBlock)callback)    {    UINavigationController *controller = (UINavigationController*)[[[UIApplication sharedApplication] keyWindow] rootViewController];    CDLoginVC *loginVC = [[CDLoginVC alloc] init];    [controller pushViewController:loginVC animated:true];    callback(@[[NSNull null]]);  }      - (dispatch_queue_t)methodQueue  {    return dispatch_get_main_queue();  }    @end 

JavaScript 当中调用上面的接口:

var React = require('react-native');    var {      // ...    NativeModules  } = React;    var SpringBoard = NativeModules.SpringBoard;    var DemoView = React.createClass({        gotoIM: function() {          // 跳转到 IM 模块          SpringBoard.gotoIM(function() {              console.log('goto IM');          });      },        render: function() {         ...      }  }); 

在 android 平台上实现上述功能

上面提到的两种原生模块开发方式,在 android 上面也都是支持的。直接上代码:

package com.awesomeproject;    // imports ...    public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler {        private ReactInstanceManager mReactInstanceManager;      private ReactRootView mReactRootView;        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          mReactRootView = new ReactRootView(this);            mReactInstanceManager = ReactInstanceManager.builder()                  .setApplication(getApplication())                  .setBundleAssetName("index.android.bundle")                  .setJSMainModuleName("index.android")                  .addPackage(new MainReactPackage())                  .addPackage(new SpringBoardPackage())                  .setUseDeveloperSupport(BuildConfig.DEBUG)                  .setInitialLifecycleState(LifecycleState.RESUMED)                  .build();            mReactRootView.startReactApplication(mReactInstanceManager, "AwesomeProject", null);            setContentView(mReactRootView);      }        // ...        // 实现跳转功能      private class SpringBoardPackage implements ReactPackage {            //...            @Override          public List<NativeModule> createNativeModules(ReactApplicationContext context) {              List<NativeModule> modules = new ArrayList<>();              modules.add(new SpringBoard(context));              return modules;          }      }        private class SpringBoard extends ReactContextBaseJavaModule {            //...            @ReactMethod          public void gotoIM(Callback callback) {              ReactApplicationContext context = getReactApplicationContext();              Intent intent = new Intent(context, LoginActivity.class);              MainActivity.this.startActivity(intent);              callback.invoke("result");          }      }  } 

React Native 最初只支持 iOS 平台,最近这半个月才开始公开支持 android,目前看支持的还不是很完善,在开发工具方面支持的都还不够好。最近一段时间以内应该是不够稳定的。

React Native 其他方面

对移动 App 的开发经验还不是很多,不过 React Native 提供了跨平台的 Navigator 组件,支持 flexbox 布局,总体感觉还不错。而且官方文档比较全面,和 Phonegap 相比,社区支持感觉更好。

来自:http://blog.limijiaoyin.com/learn-react-native/