React Native 與原生代碼混編
這兩天主要了解了 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/