Ich verwende Twilio für die IP-Messaging. Ich möchte einen Chat in meiner mobilen Hybrid-App erstellen und versuche, den Whatsup-Stil mit dem Status "Geliefert und gelesen" zu erhalten. Nach der anfänglichen Aufregung für die Twilio-Bibliothek, im Moment nichts funktioniert :(. Der Chat funktioniert die 40% der Zeiten, die anderen Male bekomme ich mehrere Fehler. Bevor ich auf die Fehler schaue, möchte ich erklären, wie ich den Code strukturiertProbleme IP-Nachricht und Twilio
.Die Idee ist, zu fragen, einmal angemeldet, alle Kanäle des Benutzers und speichert sie in self.channels
, so kann ich die letzten Gespräche des Benutzers sichtbar zu machen.
1) der erste Schritt ist, fragt ein Token, sobald sich ein Benutzer bei meiner App anmeldet.
setChatToken = function()
{
_token = data.token;
var accessManager = new Twilio.AccessManager(_token);
_messagingClient = new Twilio.IPMessaging.Client(accessManager);
_messagingClient.on('channelUpdated', function(channel)
{
for (c in self.channels)
{
if (self.channels[c].sid == channel.sid)
{ self.channels[c] = channels; }
}
});
// return a promise;
}
2) Dann frage ich alle Kanäle
// init chat system
setChatToken()
.then(function()
{
// Listen for new invitations to your Client
_messagingClient.on('channelInvited', function(channel)
{
// Automatically join channels that you were invited to
channel.join().then(function(channel)
{
handleMessageEvents(channel);
channel.attributes['him'] = channel['createdBy'];
// I'll separate old, recent and new msgs
channel['recent-messages'] = [];
channel['new-messages'] = [];
self.last_channels.push(channel);
});
});
// asks all the channels
getChannels()
.then(function()
{ // chat init ready
self.ready = true;
});
}
)
.catch(function(err){console.error(err);});
3) Dies ist der Code alle Kanäle für die Nachfrage. Ich überprüfe, ob es neue Nachrichten gibt, die die channel.lastConsumedMessageIndex
betrachten. Ich betrachte die letzten 7 Nachrichten als "neu", die anderen als "alt".
var getChannels = function()
{
// Get Messages for previously created channels
_messagingClient.getChannels()
.then(function(channels)
{ // GET CHANNELS
for (i in channels)
{
var channel = channels[i];
channel['recent-messages'] = [];
channel['old-messages'] = [];
channel['new-messages'] = [];
handleMessageEvents(channel);
self.last_channels.push(channel);
}
})
.then(function()
{ // GET MEMBERS
var promises_update_read_index = [];
for (i in self.last_channels)
{
var channel = self.last_channels[i];
var promise =
channel.getMembers()
.then(function(channelMembers)
{
// check the last message read from the other user, to know
// if there are new messages not read
for(m in channelMembers)
{
var member = channelMembers[m];
if (member.identity != me.id)
{
channel.attributes['him'] = member.identity;
channel.attributes['hisLastMsgIndex'] = member.lastConsumedMessageIndex;
// last message consumed update
member.on('updated', function(updatedMember)
{
//handle the read status information for this member
updateHisMessageReadStatus(updatedMember.identity,
updatedMember.lastConsumedMessageIndex,
updatedMember.channel.sid);
});
}
else
{ // it's me
}
}
}
);
promises_update_read_index.push(promise);
}
return $q.all(promises_update_read_index);
})
.then(function()
{ //GET MESSAGES
var promises_update_messages = [];
for (i in self.last_channels)
{
var channel = self.last_channels[i];
//determine the newest message index
var areThereNewMsgs = false;
var lastConsumedMessageIndex = channel.lastConsumedMessageIndex;
// consider the last 7 messages as 'recent', the other as 'old'
var promise =
channel.getMessages(7)
.then(function(lastChannelMessages)
{
for (j in lastChannelMessages)
{
var message = lastChannelMessages[j];
if (
message.author != me.id &&
message.index > lastConsumedMessageIndex
)
{ // there are new messages
var hisId = channel.attributes['him'];
channel['new-messages'].push(message);
}
else
{
if (channel.attributes['hisLastMsgIndex']
< channel.lastConsumedMessageIndex
)
{ message['msg-read'] = false;}
else
{ message['msg-read'] = true; }
channel['old-messages'].push(message);
}
if (message.author != me.id)
{ message['msg-read'] = false; } //hide for him
}
});
promises_update_messages.push(promise);
}
return $q.all(promises_update_messages);
})
.catch(function(err){console.error('getMessages '+JSON.stringify(err));})
.then(function()
{
$rootScope.$broadcast(self.CHANNEL_UPDATE_EVENT);
deferred.resolve(true); // i'm ready
})
.catch(function(err)
{
console.error(err);
deferred.reject(err);
});
return deferred.promise;
}
Ein Problem ist, dass oft, wenn ich einen Kanal erstellen, wird der andere Benutzer nicht automatisch den Kanal anschließen, so sende ich Nachrichten, die nie geliefert werden. Ein weiteres Problem ist
getMembers {"status":403,"description":"Forbidden","body":{"message":"Access forbidden","status":403}}
wenn ich GetChannels aufrufen(), wie zuvor definiert sind.
Gibt es ein Tutorial, um so einen vollständigen Chat zu erstellen? Oder haben Sie Vorschläge, was zu ändern und wie die Probleme überprüfen
danken yo
oooh ich sehe ... danke. Ich sehe auch, dass Twilio nach einer Weile eine Fehlermeldung über die Socket-Verbindung bekommt ... Ich denke, es ist etwas über das Timeout nach der Inaktivität. Nach diesem Fehler ist der Benutzer nicht mehr in der Lage, Nachrichten zu empfangen. Gibt es eine Möglichkeit, die Verbindung am Leben zu halten? Vielen Dank – DeLac
Sie müssen nichts tun - Verbindung sollte von selbst am Leben erhalten werden. Es kann sich um einen Bibliotheksfehler handeln. Welche Version verwendest du? – Serge