ReactNative-即时通讯WebRTC+PeerJS使用姿势

首先简单介绍一下WebRTC是个什么鬼。

什么是WebRTC

全称Web Real-Time Communication,网页即时通信,是一个支持网页浏览器进行实时语音对话或视频对话的API。它于2011年6月1日开源并在Google、Mozilla、Opera支持下被纳入万维网联盟的W3C推荐标准。

至于其他详细描述我不啰嗦了,百度一搜有很多架构图啊啥的,放一个github链接,需要的可以进去了解了解,里面有使用方法跟api:https://github.com/react-native-webrtc/react-native-webrtc

什么是PeerJS

PeerJS 提供了一个完整、可配置、易于使用、基于WebRTC的点对点的数据通信。
简单来讲,他帮你封装简化了使用WebRTC,你可以利用peerjs轻松的实现这些功能。

他们能干什么

能够实现即时通讯的语音对话、视频对话、文字对话的功能。

那接下来我们讲讲怎么搭建。

配置

首先描述一下当前搭建的环境,可能你看到这篇的时候版本啥的都已经不一样,会产生一些出入。
react-native-cli: 2.0.1
react-native: 0.62.2
webrtc:"react-native-webrtc": "^1.84.0",
peerjs:"react-native-peerjs": "^1.0.4",
android:buildToolsVersion = "28.0.3"
ios:platform :ios, '11.0'

1 导入WebRTC

因为peerjs包需要在webrtc的基础上,所以我们还是得先走一遍webrtc配置流程。

yarn add react-native-webrtc

2 ios配置

修改版本

修改platform,因为react native webrtc不支持ios11以下,所以项目如果低于11要改掉
ios/Podfile文件


image.png
添加权限

给项目添加照相跟麦克风(如果你有用到麦克风的话)的权限


image.png
<key>NSCameraUsageDescription</key>
<string>获取相机权限 文案自己调整</string>
<key>NSMicrophoneUsageDescription</key>
<string>获取麦克风权限 文案自己调整</string>

3 android配置

添加权限

给项目添加照相跟麦克风(如果你有用到麦克风的话)的权限。
其中android.permission.RECORD_AUDIO是麦克风权限,其他权限有就不用添加了。


image.png
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
添加java8支持
image.png
android {
...
compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

ok,不出意外你应该可以在代码里面调用webrtc了,比如这样

import {RTCPeerConnection} from 'react-native-webrtc'

4 导入PeerJS

peerjs官方只针对web(反正我是没找到官方提供给react native的),只找到一个热心市民的github包,别看star少,能用就行!附上链接:https://github.com/Zemke/react-native-peerjs
老规矩

yarn add react-native-peerjs

ok,不出意外你应该能在代码里这样了

import Peer from 'react-native-peerjs'

到此为止,配置完成,接下来说一下使用姿势。

使用

首先解释一下,这个东西是要配合后端一起使用的,需要你们的后端也去建立一个peerjs的服务器,然后我们去连接他,如果你按照github上的例子直接使用当然也可以用,但是跑的是peerjs官方的服务器。
如果连接官方服务器,直接一句代码就完事了

const localPeer = new Peer()

如果连接自己的服务器,那么要配置一下

localPeer = new Peer(userClientId, {
    host: WEBRTC_SERVERS, secure: true, path: WEBRTC_PATH, debug: 0, port: WEBRTC_PORT,
  });

首先,userClientId是你自己的id,是由你自己创建的字符串,当然得要唯一,具体生成什么样的就看你们项目组怎么安排了。host、path、port这些都是后端搭建好后会告诉你的,debug的数字是设置log输出内容,参考一下官方描述,

0 Prints no logs.
1 Prints only errors.
2 Prints errors and warnings.
3 Prints all logs.

secure设置为true是https,false是http。
接下来是一系列的监听回调,姿势统一

//被连接后的回调
localPeer.on('connection', function (conn) {
    console.log('local connection', conn)
  });
//new Peer后成功打开连接的回调
localPeer.on('open', localPeerId => {
    console.log('local open:' + localPeerId)
  })
//接收到data数据
localPeer.on('data', data => {
    console.log('local data:' + data)
  })
//连接关闭的回调
localPeer.on('close', () => {
    console.log('local close')
  })
//断开连接的回调
localPeer.on('disconnected', () => {
    console.log('local disconnected')

  })
//连接失败的回调
localPeer.on('error', err => {
    console.log('local error ========>' + err)
  })

一般来说,当open成功回调了我们就可以开始去连接对方了,连接对方的姿势是

conn = localPeer.connect(serverID)

serverID就是你要连接的目标id,当然前提是对方也连接了你们的后端并成功开启了。
接下来可以对这个连接对象进行一系列监听,姿势跟上面是统一的,那么你可能会奇怪了,那我有两个data事件监听(本地的peer对象以及connect生成的peer对象),我要在哪个处理接收数据呢?
因为我本身项目的需求是永远是我(手机端)去主动连接对方(网页端),所以我的data事件回调是在connect了之后生成的对象的监听里面,就是

conn.on('data', data => {
    console.log('接收到data:' + data)
  })

所以我估计(估计),如果是被动连接,那么应该就是触发?

localPeer.on('data', data => {
    console.log('local data:' + data)
  })

我没试过,有需要的试一试,不就是个回调的事嘛,输出一下就知道了。
以上差不多就是文字即时通讯的全部了,至于语音跟视频目前项目还没做需求,提供一个官方api链接,虽然针对的是web,但是是通用的:https://peerjs.com/docs.html#api

// Call a peer, providing our mediaStream
var call = peer.call('dest-peer-id',
  mediaStream);

peer.on('call', function(call) {
  // Answer the call, providing our mediaStream
  call.answer(mediaStream);
});

我觉得,应该就是这个函数了。

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

推荐阅读更多精彩内容