You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
262 lines
6.6 KiB
262 lines
6.6 KiB
<template>
|
|
<view class="">
|
|
<web-view @message="message" :src="html"></web-view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import permision from "@/utils/permission.js"
|
|
import { storeToRefs } from 'pinia';
|
|
import { useloginStore } from '@/store/login';
|
|
import pinia from '@/store/index'
|
|
import config from "@/common/config";
|
|
const userStore = useloginStore(pinia)
|
|
const {userInfo} = storeToRefs(userStore);
|
|
|
|
export default {
|
|
data() {
|
|
return {
|
|
html: '',
|
|
postMsg:null,
|
|
webview:null,
|
|
Frames: null,
|
|
mainFrame: null,
|
|
contact:null,
|
|
type:false,
|
|
wsData:null,
|
|
main_id:null,
|
|
globalConfig:userStore.globalConfig
|
|
}
|
|
},
|
|
onReady() {
|
|
// #ifdef APP-PLUS
|
|
var currentWebview = this.$scope.$getAppWebview() //获取当前页面的webview对象
|
|
var that=this;
|
|
setTimeout(function() {
|
|
that.webview = currentWebview.children()[0]
|
|
}, 600); //如果是页面初始化调用时,需要延时一下
|
|
this.postMsg = this.appsendH5
|
|
// #endif
|
|
},
|
|
onLoad: function (option) {
|
|
let platform='h5';
|
|
let calling=0;
|
|
//#ifdef H5
|
|
platform='h5';
|
|
calling=1;
|
|
//#endif
|
|
//#ifdef APP-PLUS
|
|
platform= 'app';
|
|
// 如果是app需要用户授权
|
|
this.checkAuth(option).then((e)=>{
|
|
// 如果是拨打方拿到权限之后发起通话
|
|
if(option.status==1){
|
|
setTimeout(() => {
|
|
this.postMsg({event:'calling'});
|
|
}, 800)
|
|
}
|
|
});
|
|
//#endif
|
|
let stun=encodeURIComponent(JSON.stringify({
|
|
stun:this.globalConfig.chatInfo.stun ?? '',
|
|
stunUser:this.globalConfig.chatInfo.stunUser ?? '',
|
|
stunPass:this.globalConfig.chatInfo.stunPass ?? '',
|
|
}));
|
|
this.html='/hybrid/html/index.html?id='+userInfo.value.user_id+'&status='+option.status+'&calling='+calling+'&name='+option.name+'&target_id='+option.id+'&type='+option.type+'&platform='+platform+'&avatar='+option.avatar+'&stun='+stun;
|
|
this.main_id=option.msg_id;
|
|
this.type= option.type;
|
|
this.status = option.status
|
|
this.contact={
|
|
id:option.id,
|
|
displayName:option.name,
|
|
avatar:option.avatar
|
|
}
|
|
// #ifdef H5
|
|
setTimeout(() => {
|
|
this.Frames = document.getElementsByTagName('iframe');
|
|
this.mainFrame = this.Frames[0].contentWindow;
|
|
this.postMsg = this.h5sendH5
|
|
}, 500)
|
|
|
|
window.onmessage = (e) => {
|
|
this.msgCallback(e)
|
|
}
|
|
//#endif
|
|
|
|
uni.$off('webrtcConn');
|
|
// 接收websocket传输过来的消息,并发送给webview
|
|
uni.$on('webrtcConn',(e)=>{
|
|
if(e.fromUser.id==userInfo.value.user_id){
|
|
if(e.extends.event=="otherOpt"){
|
|
this.wsData=null;
|
|
this.main_id=null;
|
|
this.postMsg({event:'hangup'},'*');
|
|
}
|
|
return;
|
|
}
|
|
// 如果msgID不相同,表示在忙线中
|
|
if(this.main_id && this.main_id!=e.id){
|
|
this.$api.msgApi.sendToMsg({
|
|
toContactId:e.fromUser.user_id,
|
|
type:e.extends.type,
|
|
event:'busy',
|
|
status:e.extends.status,
|
|
code:907,
|
|
id:e.id,
|
|
msg_id:e.msg_id,
|
|
})
|
|
return;
|
|
}else{
|
|
this.wsData=e;
|
|
if(this.main_id && this.main_id==e.id){
|
|
this.postMsg(JSON.parse(JSON.stringify(e.extends)),'*');
|
|
}
|
|
}
|
|
|
|
})
|
|
},
|
|
methods: {
|
|
async checkAuth(option){
|
|
// #ifdef APP-PLUS
|
|
let record=await this.requestPermission('record');
|
|
if(!record){
|
|
return false;
|
|
}
|
|
if(option.type==1){
|
|
let camera=await this.requestPermission('camera');
|
|
if(!camera){
|
|
return false;
|
|
}
|
|
}
|
|
// #endif
|
|
},
|
|
//音视频权限获取
|
|
async requestPermission(auth) {
|
|
let isIos=false;
|
|
// #ifdef APP-PLUS
|
|
isIos = (plus.os.name == "iOS")
|
|
// #endif
|
|
let andriodAuth='';
|
|
if(auth=='record'){
|
|
andriodAuth='android.permission.RECORD_AUDIO';
|
|
}else if(auth=='camera'){
|
|
andriodAuth='android.permission.CAMERA';
|
|
}
|
|
if(isIos){
|
|
// let iosRes = await permision.judgeIosPermission(auth);
|
|
return true;
|
|
}else{
|
|
let andRes = await permision.requestAndroidPermission(andriodAuth);
|
|
return andRes==1 ? true : false;
|
|
}
|
|
},
|
|
// 接收webview传输过来的消息
|
|
message(event) {
|
|
const msg = {
|
|
data: event.detail.data[0]
|
|
}
|
|
this.msgCallback(msg)
|
|
},
|
|
// app端向webview传输消息
|
|
appsendH5(params) {
|
|
if (params.iceCandidate && params.iceCandidate.length>0){
|
|
params.iceCandidate = JSON.parse(params.iceCandidate)
|
|
}
|
|
this.webview.evalJS("getUniAppMessage('" + JSON.stringify(params) + "')")
|
|
},
|
|
// h5端向webview传输消息
|
|
h5sendH5(params) {
|
|
this.mainFrame.postMessage(params, '*')
|
|
},
|
|
msgCallback(e){
|
|
let iceCandidate = '';
|
|
let msg_id='';
|
|
if(this.wsData){
|
|
msg_id=this.wsData.msg_id ?? '';
|
|
}
|
|
let api=true;
|
|
switch(e.data['event']){
|
|
case 'hangup':
|
|
this.closeCall();
|
|
if(e.data['code']==907){
|
|
uni.showToast({
|
|
title: '对方忙~~',
|
|
icon:'none'
|
|
})
|
|
}
|
|
if(!e.data.isbtn){
|
|
api=false;
|
|
}
|
|
break;
|
|
case 'iceCandidate':
|
|
console.log('监听同步ice')
|
|
let niceCandidate = {}
|
|
niceCandidate['candidate'] = e.data['iceCandidate']['candidate']
|
|
niceCandidate['sdpMLineIndex'] = e.data['iceCandidate']['sdpMLineIndex']
|
|
niceCandidate['sdpMid'] = e.data['iceCandidate']['sdpMid']
|
|
iceCandidate=JSON.stringify(niceCandidate)
|
|
break;
|
|
case "mediaDevices":
|
|
api=false;
|
|
uni.showToast({
|
|
title: '请检查音视频',
|
|
icon:'none'
|
|
})
|
|
this.closeCall();
|
|
}
|
|
if(api){
|
|
this.$api.msgApi.sendToMsg({
|
|
id:this.main_id,
|
|
msg_id:msg_id,
|
|
toContactId:this.contact.id,
|
|
type:this.type,
|
|
event:e.data['event'],
|
|
status:e.data['status'] ?? '',
|
|
code:e.data['code'] ?? '',
|
|
callTime:e.data['callTime'] ?? '',
|
|
sdp:e.data['sdp'] ?? '',
|
|
iceCandidate:iceCandidate,
|
|
}).then((res)=>{
|
|
if(e.data['event']=='calling'){
|
|
this.wsData=res.data;
|
|
}
|
|
if(res.data.extends.code==907){
|
|
uni.showToast({
|
|
title:'对方不在线',
|
|
icon:'none'
|
|
})
|
|
this.closeCall();
|
|
}
|
|
});
|
|
}
|
|
|
|
},
|
|
//关闭通话页面
|
|
closeCall(){
|
|
const innerAudioContext = uni.createInnerAudioContext();
|
|
innerAudioContext.autoplay = true;
|
|
innerAudioContext.src = config.apiUrl+'/static/voice/guaduan.mp3';
|
|
innerAudioContext.onStop((res) => {
|
|
this.$forceUpdate()
|
|
})
|
|
let pages = getCurrentPages();
|
|
if (pages.length > 1) {
|
|
uni.navigateBack();
|
|
} else {
|
|
uni.reLaunch({
|
|
url: '/pages/index/index'
|
|
})
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
.container {
|
|
padding: 20px;
|
|
font-size: 14px;
|
|
line-height: 24px;
|
|
}
|
|
</style>
|
|
|