iOS原生和React-Native之间的交互1
今天,记录一下iOS原生和React-Native之间的交互.如果第一次接触最好先移步至 http://www.cnblogs.com/shaoting/p/6388502.html 先看一下怎么在iOS原生中集成react-native模块.
iOS原生和React-Native之间的交互主要通过NativeModules实现.
先看RN->iOS原生
开发环境版本:

准备:
终端新建一个react-native项目或者使用上一篇文章建立的demo.
a.先使用Xcode打开,新建一个CalendarManager类,集成自NSObject即可.先在CalendarManager.h中导入相关类和实现协议RCTBridgeModule
//
// CalendarManager.h
// rnAndN
//
// Created by Shaoting Zhou on 2017/2/10.
// Copyright © 2017年 Facebook. All rights reserved.
// #import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>
#import <React/RCTLog.h>
@interface CalendarManager : NSObject<RCTBridgeModule> @end
b.CalendarManager.m配置,为了实现该协议,需要含有一个宏:RCT_EXPORT_MODULE(),
//
// CalendarManager.m
// rnAndN
//
// Created by Shaoting Zhou on 2017/2/10.
// Copyright © 2017年 Facebook. All rights reserved.
// #import "CalendarManager.h" @implementation CalendarManager RCT_EXPORT_MODULE();
c.react-native 通过NativeModules来实现传输和接受消息:
import {
AppRegistry,
StyleSheet,
Text,
View,
NativeModules
} from 'react-native';
var CalendarManager = NativeModules.CalendarManager;
1.基本调用:
CalendarManager.m
// 接收传过来的 NSString
RCT_EXPORT_METHOD(addEventOne:(NSString *)name){
NSLog(@"接收传过来的NSString+NSString: %@", name);
}
RN:
CalendarManager.addEventOne('周少停');
2.字符串+字典:
CalendarManager.m
// 接收传过来的 NSString + NSDictionary
RCT_EXPORT_METHOD(addEventTwo:(NSString *)name details:(NSDictionary *)details)
{
RCTLogInfo(@"接收传过来的NSString+NSDictionary: %@ %@", name, details);
}
RN:
CalendarManager.addEventTwo('周少停',{job:'programmer'});
3.字符串+日期:
CalendarManager.m
// 接收传过来的 NSString + date日期
RCT_EXPORT_METHOD(addEventThree:(NSString *)name date:(NSDate *)date)
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init] ;
[formatter setDateFormat:@"yyyy-MM-dd"];
RCTLogInfo(@"接收传过来的NSString+NSDictionary: %@ %@", name, [formatter stringFromDate:date]);
}
RN:
CalendarManager.addEventThree('周少停',19910730);
4.点击调原生+回调
CalendarManager.m
// 对外提供调用方法,演示Callback
RCT_EXPORT_METHOD(testCallbackEventOne:(NSString *)name callback:(RCTResponseSenderBlock)callback)
{
NSLog(@"%@",name);
NSArray *events=@[@"1", @"2", @"3",@"4"]; //准备回调回去的数据
callback(@[[NSNull null],events]);
}
RN:
// 传原生一个字符串 + 回调
callBackOne = ()=>{
CalendarManager.testCallbackEventOne(('我是RN给原生的'),(error, events) => {
if (error) {
console.error(error);
} else {
alert(events)
}
})
}
5.Promises
CalendarManager.m
//Promises
// 对外提供调用方法,演示Promise使用
RCT_REMAP_METHOD(testCallbackEventTwo,
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
{
NSArray *events =@[@"one ",@"two ",@"three"];//准备回调回去的数据
if (events) {
resolve(events);
} else {
NSError *error=[NSError errorWithDomain:@"我是Promise回调错误信息..." code:101 userInfo:nil];
reject(@"no_events", @"There were no events", error);
}
}
RN:
try{
var events=await CalendarManager.testCallbackEventTwo();
alert(events)
}catch(e){
console.error(e);
}
5.使用原生定义的常量
CalendarManager.m
- (NSDictionary *)constantsToExport
{
return @{ @"ValueOne": @"我是从原生定义的~" };
}
RN:
alert(CalendarManager.ValueOne)
完整代码:
CalendarManager.m
//
// CalendarManager.m
// rnAndN
//
// Created by Shaoting Zhou on 2017/2/10.
// Copyright © 2017年 Facebook. All rights reserved.
// #import "CalendarManager.h" @implementation CalendarManager RCT_EXPORT_MODULE(); // 接收传过来的 NSString
RCT_EXPORT_METHOD(addEventOne:(NSString *)name){
NSLog(@"接收传过来的NSString+NSString: %@", name);
}
// 接收传过来的 NSString + NSDictionary
RCT_EXPORT_METHOD(addEventTwo:(NSString *)name details:(NSDictionary *)details)
{
RCTLogInfo(@"接收传过来的NSString+NSDictionary: %@ %@", name, details);
} // 接收传过来的 NSString + date日期
RCT_EXPORT_METHOD(addEventThree:(NSString *)name date:(NSDate *)date)
{
NSDateFormatter *formatter = [[NSDateFormatter alloc] init] ;
[formatter setDateFormat:@"yyyy-MM-dd"];
RCTLogInfo(@"接收传过来的NSString+NSDictionary: %@ %@", name, [formatter stringFromDate:date]);
} // 对外提供调用方法,演示Callback
RCT_EXPORT_METHOD(testCallbackEventOne:(NSString *)name callback:(RCTResponseSenderBlock)callback)
{
NSLog(@"%@",name);
NSArray *events=@[@"1", @"2", @"3",@"4"]; //准备回调回去的数据
callback(@[[NSNull null],events]);
} //Promises
// 对外提供调用方法,演示Promise使用
RCT_REMAP_METHOD(testCallbackEventTwo,
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)
{
NSArray *events =@[@"one ",@"two ",@"three"];//准备回调回去的数据
if (events) {
resolve(events);
} else {
NSError *error=[NSError errorWithDomain:@"我是Promise回调错误信息..." code:101 userInfo:nil];
reject(@"no_events", @"There were no events", error);
}
} - (NSDictionary *)constantsToExport
{
return @{ @"ValueOne": @"我是从原生定义的~" };
} @end
RN:
/**
* Sample React Native App
* https://github.com/facebook/react-native
* @flow
*/ import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
NativeModules
} from 'react-native';
var CalendarManager = NativeModules.CalendarManager; export default class NativeAddRN extends Component {
render() {
return (
<View style={styles.container}>
<Text style={styles.welcome} onPress={()=>this.passValueToNativeOne()}>点击往原生传字符串</Text>
<Text style={styles.welcome} onPress={()=>this.passValueToNativeTwo()}>点击往原生传字符串+字典</Text>
<Text style={styles.welcome} onPress={()=>this.passValueToNativeThree()}>点击往原生传字符串+日期</Text>
<Text style={styles.welcome} onPress={()=>this.callBackOne()}>点击调原生+回调</Text>
<Text style={styles.welcome} onPress={()=>this.callBackTwo()}>Promises</Text>
<Text style={styles.welcome} onPress={()=>this.useNativeValue()}>使用原生定义的常量</Text>
</View>
);
}
// 传原生一个字符串
passValueToNativeOne = ()=>{
CalendarManager.addEventOne('周少停');
}
// 传原生一个字符串 + 字典
passValueToNativeTwo = ()=>{
CalendarManager.addEventTwo('周少停',{job:'programmer'});
}
// 传原生一个字符串 + 日期
passValueToNativeThree = ()=>{
CalendarManager.addEventThree('周少停',19910730);
}
// 传原生一个字符串 + 回调
callBackOne = ()=>{
CalendarManager.testCallbackEventOne(('我是RN给原生的'),(error, events) => {
if (error) {
console.error(error);
} else {
alert(events)
}
})
}
//Promise回调
async callBackTwo(){
try{
var events=await CalendarManager.testCallbackEventTwo();
alert(events)
}catch(e){
console.error(e);
}
}
//使用原生定义的常量
useNativeValue = ()=>{
alert(CalendarManager.ValueOne)
} } const styles = StyleSheet.create({
container: {
flex: 1,
marginTop:100
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
}); AppRegistry.registerComponent('NativeAddRN', () => NativeAddRN);
演示效果和demo源码:https://github.com/pheromone/IOS-native-and-React-native-interaction
另:因为react native并不提供清除缓存功能,所以只能通过react native调用原生来实现计算缓存大小和清除缓存功能:
iOS:
//
// CalendarManager.m
// rnAndN
//
// Created by Shaoting Zhou on 2017/2/10.
// Copyright © 2017年 Facebook. All rights reserved.
// #import "CalendarManager.h"
@implementation CalendarManager RCT_EXPORT_MODULE(); // 清理缓存
RCT_EXPORT_METHOD(cleanCache:(RCTResponseSenderBlock)callback)
{
NSURLCache *httpCache = [NSURLCache sharedURLCache];
[httpCache removeAllCachedResponses];
NSUInteger cache = [httpCache currentDiskUsage];
callback(@[[NSNull null],@(cache)]);
}
// 计算缓存
RCT_EXPORT_METHOD(cacheSize:(RCTResponseSenderBlock)callback)
{
NSURLCache *httpCache = [NSURLCache sharedURLCache];
NSUInteger cache = [httpCache currentDiskUsage];
callback(@[[NSNull null],@(cache)]);
}
@end
RN:
再进入清除缓存界面时,就计算缓存大小:
componentWillMount() {
CalendarManager.cacheSize((error, events) => {
if (error) {
console.error(error);
} else {
this.setState({
cache:Math.round(events/1024) //缓存大小
})
}
})
}
清除缓存按钮响应时间:
clearRom =()=>{
CalendarManager.cleanCache((error, events) => {
if (error) {
console.error(error);
} else {
this.setState({
cache:0 //这里本应该是清除之后的数据Math.round(events/1024).应该是0才对,但是总是清不干净,我就直接置为0了
})
}
})
}
iOS清除缓存源码可以参考该微博项目中的:https://github.com/pheromone/react_native_weibo
安卓待写....
iOS原生和React-Native之间的交互1的更多相关文章
- iOS原生 和 react native视图混编
在iOS原生功能中加入RN,请看之前 写的 RN与iOS交互系列文章.本篇只讲下视图混编. 关键点只有二: 1.通过 RCTRootView 加载RN视图. 2.RN中,只需要AppRegistry. ...
- 一个资深iOS开发者对于React Native的看法
一个资深iOS开发者对于React Native的看法 当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道. 我认为一个js开发者可以使用javasc ...
- 现有iOS项目集成React Native过程记录
在<Mac系统下React Native环境搭建>配置了RN的开发环境,然后,本文记录在现有iOS项目集成React Native的过程,官方推荐使用Cocoapods,项目一开始也是使用 ...
- iOS 写给iOS开发者的React Native学习路线(转)
我是一名iOS开发者,断断续续一年前开始接触React Native,最近由于工作需要,专职学习React Native也有一个多月了.网络上知识资源非常的多,但能让人豁然开朗.迅速学习的还是少数,我 ...
- 写给iOS开发者的React Native学习路线(转)
我是一名iOS开发者,断断续续一年前开始接触React Native,最近由于工作需要,专职学习React Native也有一个多月了.网络上知识资源非常的多,但能让人豁然开朗.迅速学习的还是少数,我 ...
- [转] 一个资深iOS开发者对于React Native的看法
当我第一次尝试ReactNative的时候,我觉得这只是网页开发者涉足原生移动应用领域的歪门邪道. 我认为一个js开发者可以使用javascript来构建iPhone应用确实是一件很酷的事情,但是我很 ...
- Android原生嵌入React Native
1.首先集成的项目目录 我使用的是直接按照react-native init Project 的格式来导入的,也就是说,我的Android项目目录是跟node_modules是在一个目录下的. 我们i ...
- Flutter介绍 - Flutter,H5,React Native之间的对比
Flutter介绍 Flutter是Google推出的开源移动应用开发框架.开发者可以通过开发一套代码同时运行在iOS和Android平台. 它使用Dart语言进行开发,并且最终编译成各个平台的Nat ...
- 《React Native 精解与实战》书籍连载「iOS 平台与 React Native 混合开发」
此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...
- 【React Native】在原生和React Native间通信(RN调用原生)
一.从React Native中调用原生方法(原生模块) 原生模块是JS中也可以使用的Objective-C类.一般来说这样的每一个模块的实例都是在每一次通过JS bridge通信时创建的.他们可以导 ...
随机推荐
- 【Oracle】【2】复制表结构及其数据
--复制表结构及其数据 create table table_name_new as select * from table_name_old; --只复制表结构 ; --create table t ...
- C++的成员初始化列表和构造函数体(以前未知)
成员的初始化列表和构造函数在对成员指定初值方面是不一样的.成员初始化列表是对成员初始化,而构造函数,是对成员赋值 成员初始化列表使用初始化的方式来为数据成员指定初值, 而构造函数的函数体是通过赋值的方 ...
- Oracle 数据库中查看表空间的2种方法
在Oracle数据库中查看表空间使用状况是我们在实际应用中经常涉及到的,以下的内容就就是对Oracle 数据库中查看表空间使用状况时所要用到的SQL的描述,希望你能从中获得自己想要的东西. Oracl ...
- [codechef July Challenge 2017] Calculator
CALC: 计算器题目描述大厨有一个计算器,计算器上有两个屏幕和两个按钮.初始时每个屏幕上显示的都是 0.每按一次第一个按钮,就会让第一个屏幕上显示的数字加 1,同时消耗 1 单位的能量.每按一次第二 ...
- 第一讲(3)osgearth编译
前题条件完成osg 3.0的编译Step 1 下载osgEarth 2.1.1https://github.com/gwaldron/osgearth/downloads------------> ...
- 【转】SQLServer汉字转全拼音函数
USE Test go IF OBJECT_ID('Fn_GetQuanPin','Fn') IS NOT NULL DROP FUNCTION fn_GetQuanPin go create fun ...
- Linux磁盘性能分析(CentOS)
1.top查看CPU是否长时间等待IO top %wa超过30%,说明IO压力很大 2.iostat查看磁盘工作时长占比 iostat -x #1表示1秒刷新一次 %util表示在过去的时间段中磁盘进 ...
- js如何将选中图片文件转换成Base64字符串?
如何将input type="file"选中的文件转换成Base64的字符串呢? 1.首先了解一下为什么要把图片文件转换成Base64的字符串 在常规的web开发过程中,大部分上传 ...
- Linux int 最大为多大
可以查看 /usr/include/limits.h 文件 里面定义好了各种类型的最大最小值 ... /* Minimum and maximum values a `signed int' can ...
- linux下top命令参数详解
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法. 内存信息.内容如下: Mem: 191272k to ...