2016-04-18 8 views
0

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

Antwort

0

Wenn ein getChannels() tun, sind Sie alle Kanäle empfangen, die dem Kunden bekannt sind. Sie haben zwar keine Berechtigung, Mitglieder und Nachrichten von einem Kanal zu erhalten, mit dem Sie nicht verbunden sind. Also möchten Sie vielleicht Ihren Code zu ändern:

_messagingClient.getChannels() 
    .then(channels => channels 
    .filter(channel => channel.status === 'joined')) 
    .forEach(channel => { 
     channel.getMembers(); 
     channel.getMessages(); 
     etc... 
    }) 
); 
+0

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

+0

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