我正在编写基于Ionic2和WebRTC的Android应用程序
具体来说,我使用了这个库https://github.com/feross/simple-peer
我使用推送通知在两个应用程序之间交换信令数据
当用户想要联系另一个时,称为 connectToPeer()方法,然后另一个接收请求并返回响应。
一切正常,除了你必须建立真正的连接,I have this error。
这是类代码:
var self;
var peer;
import {Injectable} from 'angular2/core';
import {Storage, LocalStorage, Events} from 'ionic-angular';
@Injectable()
export class VallasciappData {
static get parameters() {
return [[Events]];
}
constructor(events) {
//conacts data
if(window.localStorage.getItem("contacts") == null || window.localStorage.getItem("contacts") == 'false'){
this.contacts = [
{
username: 'This is a contact',
id:'1'
},
{
username: 'Another contact',
id:'2'
}
];
}else{
this.contacts = JSON.parse(window.localStorage.getItem("contacts"));
}
//messages data
if(window.localStorage.getItem("messages") == null || window.localStorage.getItem("messages") == 'false'){
this.data = [{
username: 'Myapp',
id: '1',
lastMessage: "Welcome to Myapp",
messages: [{
emitter: '1',
type: 'text',
text: 'Welcome to Myapp',
url: '0',
date: '0/0/0',
time: '0:0'
}]
}];
}else{
this.data = JSON.parse(window.localStorage.getItem("messages"));
}
window.localStorage.setItem("messages", JSON.stringify(this.data));
self=this;
this.peers = new Array();
this.saveData();
this.events = events;
this.showProgressBar = true;
var push = PushNotification.init({
android: {
senderID: "XXXXXXXXXX"
}
});
push.on('registration', (data) => {
// data.registrationId
alert(data.registrationId);
this.sendMyRID(data.registrationId);
});
push.on('notification', (data) => {
// data.message,
// data.title,
// data.count,
// data.sound,
// data.image,
// data.additionalData
alert(data.title+data.message);
console.log(data); //this.peers[sessionID]
//var additionalData = data.additionalData
if(data.additionalData.additionalData.type == "offer"){
console.log("offer ok");
peer = new SimplePeer({initiator: false, trickle: false });
peer.on('error', (err) => { console.log('error', err) });
peer.on('signal', (datap) => {
console.log('SIGNAL', JSON.stringify(datap))
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (xhttp.readyState == 4 && xhttp.status == 200) {
console.log(xhttp.responseText);
var xmlResponse = xhttp.responseXML;
var reply = xmlResponse.getElementsByTagName("response")[0].childNodes[0].nodeValue;
console.log(reply);
if (reply == "send ok") {} else {}
}
};
var additionalData = {
'Sid': window.localStorage.getItem("id"),
'Rid': data.additionalData.additionalData.Sid,
'type': "answer",
'response': JSON.stringify(datap)
};
console.log("ok1");
xhttp.open("POST", "http://XXXXXXXXXXXXXXXXXXXX", true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("username=" + window.localStorage.getItem("username") +
"&password=" + window.localStorage.getItem("password") +
"&id=" + window.localStorage.getItem("id")+
"&Rid=" + data.additionalData.additionalData.Sid+
"&additionalData=" + JSON.stringify(additionalData));
console.log("ok2");
});
peer.signal(JSON.parse(data.additionalData.additionalData.response));
peer.on('connect', () => {
console.log('CONNECT');
peer.send('whatever' + Math.random());
});
peer.on('data', (data) => {
console.log('data: ' + data)
});
}
if(data.additionalData.additionalData.type == "answer"){
console.log("answer ok");
peer.signal(JSON.parse(data.additionalData.additionalData.response));
console.log("peer signal ok");
peer.send('prova messaggio');
console.log("prova messaggio");
}
});
push.on('error', (e) => {
// e.message
});
}
connectToPeer(sessionID){
if(this.peers[sessionID] == null){
console.log("okk");
peer = new SimplePeer({ initiator: true, trickle: false });
peer.on('error', (err) => { console.log('error', err) });
peer.on('signal', (data) => {
console.log('SIGNAL', JSON.stringify(data));
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (xhttp.readyState == 4 && xhttp.status == 200) {
console.log(xhttp.responseText);
var xmlResponse = xhttp.responseXML;
var reply = xmlResponse.getElementsByTagName("response")[0].childNodes[0].nodeValue;
console.log(reply);
if (reply == "send ok") {} else {}
}
};
var additionalData = {
'Sid': window.localStorage.getItem("id"),
'Rid': sessionID,
'type': "offer",
'response': JSON.stringify(data)
};
console.log("ok1");
xhttp.open("POST", "http://XXXXXXXXXXXXXXXXXXXXXXXX", true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("username=" + window.localStorage.getItem("username") +
"&password=" + window.localStorage.getItem("password") +
"&id=" + window.localStorage.getItem("id")+
"&Rid=" + sessionID+
"&additionalData=" + JSON.stringify(additionalData));
console.log("ok2");
});
peer.on('connect', () => {
console.log('CONNECT');
peer.send('whatever' + Math.random());
});
peer.on('data', (data) => {
console.log('data: ' + data);
});
}else{
console.log("noting");
}
}
sendMyRID(id) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (xhttp.readyState == 4 && xhttp.status == 200) {
console.log(xhttp.responseText);
var xmlResponse = xhttp.responseXML;
var reply = xmlResponse.getElementsByTagName("response")[0].childNodes[0].nodeValue;
console.log(reply);
if (reply == "update ok") {} else {}
}
};
xhttp.open("POST", "http://XXXXXXXXXXXXXXXXX", true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send("regid=" + id);
}
saveData() {
//if(this.data != self.data)
this.data = self.data;
//this.showProgressBar = self.showProgressBar;
console.log("ciao");
//var sd = JSON.parse(window.localStorage.getItem("messages"));
/*if (self.data != sd) {
self.data = JSON.parse(window.localStorage.getItem("messages"));
}*/
setTimeout(() => {
this.saveData();
}, 500);
}
}
答案 0 :(得分:0)
我做了一些测试,我发现如果连接两次建立连接,但我不知道为什么。