2016-04-18 13 views
0

私はTwilioをIPメッセージングに使用しています。私は私のモバイルハイブリッドアプリでチャットを作成したい、と私は、配信され、メッセージの状態を読むと、whatsupスタイルを取得しようとしています。 Twilioライブラリの最初の興奮の後、今は何も動作していません:(。チャットは40%の時間で動作しますが、何度かエラーが発生します。エラーを見る前に、 。問題IP-messaginとTwilio

アイデアは、一度ログインして、聞いて、そのユーザのすべてのチャンネルとself.channelsでそれらを格納することですので、私は、そのユーザーの最後の会話を視覚化することができます。

1)非常に最初のステップはあるが尋ねますユーザーが自分のアプリにログインするとすぐに

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)それから私は、これはすべてのチャンネルを尋ねるためのコードである)

// 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すべてのチャンネルをお願いします。 channel.lastConsumedMessageIndexを見ている新しいメッセージがあるかどうかを確認します。最後の7つのメッセージは「最近」、もう1つは「古い」とみなされます。

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; 
     } 

チャンネルを作成すると、他のユーザーが自動的にチャンネルに参加しないことが多いため、配信されなかったメッセージを送信します。前に定義されたとおり、私はgetChannels()を呼び出す場合 別の問題は、

getMembers {"status":403,"description":"Forbidden","body":{"message":"Access forbidden","status":403}} 

あります。

このような完全なチャットを作成するチュートリアルはありますか?それとも、あなたはどのようにチェックするために変更するかについての提案とを持っている問題

がクライアントに知られているよgetChannels()を行う場合

答えて

0

、あなたが受けているすべてのチャネルを、ありがとうございました。 参加していないチャンネルのメンバーやメッセージを取得する権限はありませんが、 したがって、コードを次のように変更することができます。

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

よろしくお願いいたします...ありがとうございます。また、しばらくすると、Twilioがソケット接続に関するエラーを受け取ることがわかりました...私はそれが非アクティブの後にタイムアウトについて何かだと思います。そのエラーが発生すると、ユーザーはメッセージを受信できなくなります。接続を維持する方法はありますか? – DeLac

+0

あなたは何もする必要はありません - 接続は生き続けるべきです。ライブラリのバグかもしれません。どのバージョンを使用していますか? – Serge