ReactNative跨平台开发实践-简易直播demo2

接ReactNative跨平台开发实践-简易直播demo1

三:实现细节

1.集成ReactNative

官网上已经对安卓与iOS平台集成ReactNative描述的很详细了,在此就仅附上官网地址,按照官网步骤就可以集成到现有的原生APP中了。
官网地址:http://facebook.github.io/react-native/docs/integration-with-existing-apps.html

2.第三方库使用方法

简要介绍下对于本demo中使用到的百度推流端SDK,播放端SDK与融云IM SDK的使用方式。
以iOS端为例:
整个工程是基于cocoapods来开发的,因为引用了第三方库,使用cocoapods方便管理。

    pod 'BaiduBCECapture', "~> 2.0"
    pod 'BaiduBCEPlayerLSS', "2.0.0"
    pod 'RongCloudIM', "~> 2.8.14"

推流SDK:BaiduBCECapture与播放SDK:BaiduBCEPlayerLSS的使用比较简单,根据官网提供的demo中的调用方法,将自己的View(在安卓中则是surfaceView)交给SDK来持有就能实现视频渲染了。
下图则是具体的与第三方SDK的交互流程:

类设计思路.png

根据上图再看代码就很清晰了。
再简要介绍下融云IM SDK:RongCloudIM的使用方法,基本原理为实现协议RCIMClientReceiveMessageDelegate,接收到消息进入协议方法onReceived,其余例如发送消息的操作都是由单例来完成。

3.(重点)将native组件包装成component暴露给JS的实现过程

首先附上官网中将Native UI Component封装给RN的地址:
iOS:http://facebook.github.io/react-native/docs/native-components-ios.html
Android:http://facebook.github.io/react-native/docs/native-components-android.html
根据前面的设计思路,可以总结出需要封装的类即为持有了Model的原生类,RN层需要在这个原生组件之上放置按钮等控件。
iOS的封装的步骤按照官网步骤即可,但安卓的就要复杂一些,首先明确在安卓中是由ViewGroup来管理一系列的View的,但由于我们是想跟iOS的设计思路保持一致,即在RN中直接使用原生类的component,在其上加控件,那么需要封装的就不能是官网示例中的 SimpleViewManager了,必须是可以管理View的ViewGroup,由于我不会安卓开发,关于这点走了不少的弯路,还是万分感谢安卓的同事的指点。

public class ZYLiveBackGroundViewManager extends ViewGroupManager<FrameLayout>

暴露给RN的方法:
1.无需回调的方法:RCT_EXPORT_METHOD(),如界面上的返回按钮就无需回调,这个按钮直接返回设置页,无论结束推流或播放停止时是成功还是失败都会返回,所以无需将其设置为回调方法。
2.需要回调的方法:RCT_REMAP_METHOD(),如推流界面的控制摄像头方向,设置美颜,设置闪光灯以及开启推流等按钮都需要知道是否操作成功,若操作成功更改界面,来提示用户操作成功,这类需要更新UI的方法就需要回调。
具体实现方法附上官网地址:
iOS:http://facebook.github.io/react-native/docs/native-modules-ios.html
Android:http://facebook.github.io/react-native/docs/native-modules-android.html

这里值得注意的是RN在设计的时候,无论是iOS还是安卓,只要是原生封装暴露给RN的component,都已经实现了桥接协议:

iOS:
@interface RCTViewManager : NSObject <RCTBridgeModule>

android:
...
public abstract class ViewGroupManager <T extends ViewGroup>
    extends BaseViewManager<T, LayoutShadowNode>
...
...
public abstract class BaseViewManager<T extends View, C extends LayoutShadowNode> extends ViewManager<T, C> 
...
...
public abstract class ViewManager<T extends View, C extends ReactShadowNode> extends BaseJavaModule 
...

这样做的原因应该去看下源码才能理解了,但对我们来说,本身已经暴露成功的Native UI Component就已经可以当成Native Module来使用了。所以,关于module的方法都可直接写在这个component中。
使用方法如下,以iOS中的推流层为例:

nativeStreamView.js
module.exports = requireNativeComponent('ZYLiveBackGroundView', null);//将原生封装的Component暴露出来

streamView.js
import ZYLiveBackGroundView from './nativeStreamView';//获取原生暴露的Component
var myModule = NativeModules.ZYLiveBackGroundViewManager;//获取原生暴露的module,其实都是从iOS的ZYLiveBackGroundViewManager这个类中获取的
...//component的使用:
<ZYLiveBackGroundView style={styles.background}>
...
...//module的使用
myModule.onBack();
...

介绍完JS调用原生类后再介绍下原生调用RN的实现,上诉基本是JS来调用原生的控件或方法的,但由于加入了聊天室的功能,融云IM SDK是用原生来实现的,当收到新的消息是,SDK的回调也仅限于原生类,而我们需要在界面上显示收到的这个消息,所以需要在原生收到消息时告知JS来更新界面,这也叫作消息分发。
附上官网实现方法:
iOS:http://facebook.github.io/react-native/docs/native-modules-ios.html#sending-events-to-javascript
Android:http://facebook.github.io/react-native/docs/native-modules-android.html#sending-events-to-javascript
首先我去查找了RCTEventEmitter这个消息分发类,发现这个类与RCTViewManager无关,所以没法再在同一个原生类中实现消息回传RN了,只能新建一个专门用于实现调用JS的类。

iOS ,Android:
IMCloud

具体的使用方法官方文档里已经描述的很清楚了,这里就不重复了,直接看代码就明白了。

四.打包

无论是iOS打包或安卓打包都需要将JS文件与图片文件打包至bundle中,引入工程,但官网中并未提及这点(略坑),所以简要说一下打包的步骤。

iOS打包步骤:

1.打包命令:到项目根目录下执行

react-native bundle --entry-file ./index.ios.js --bundle-output ./ios/index.ios.jsbundle --platform ios --assets-dest ./ios --dev false

输出文件也可不放到iOS工程下,然后回到Xcode中,添加刚刚生成的
idex.ios.jsbundle与assets文件,其中assets的添加方式要选为Create Folder Reference,然后将Scheme修改为release,获取jsbundle的方式改为:

//打包后获取离线bundle
    jsCodeLocation = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"index.ios.jsbundle" ofType:nil]];

就可以打包上传iOS应用了。

安卓打包步骤

参考:
http://www.jianshu.com/p/61e27d9b02f2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,881评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,052评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,598评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,407评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,823评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,872评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,037评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,778评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,505评论 1 247
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,745评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,233评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,231评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,141评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,939评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,954评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,784评论 2 275

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,589评论 25 707
  • 最近在学习ReactNative开发,感觉还是很容易上手的,搜集了不少资料,分享给大家。 为什么选ReactNat...
    StChris阅读 1,622评论 0 37
  • 一、要想理解多线程,必须要了解一下几个概念: 1.什么是进程: 例如:同时打开QQ和微信,系统同时启动两个程序,此...
    MangoJ阅读 202评论 0 1
  • 今天小朋友们期中考试全部完成了,语文成绩没有出来,数学与英语出来了。然后弟就对我说:“妈妈,有一个好消息,一...
    芸飘燃阅读 148评论 0 0
  • #日记迎春20170304日行一善 早晨去打扫工作室,摆好垫子,准备茶水,水果等,为学习小组的活动做准备,感谢提前...
    静俭阅读 131评论 0 0