消息正文在xamarin native c#中的quickblox ios上为空

时间:2016-10-19 09:26:06

标签: c# ios xamarin xamarin.ios quickblox

我在Xamarin iOS和Android原生版中翻译了quickblox的Xamarin表单示例应用程序。 一切都“有效”,即检索消息失败。

我从一个客户端发送消息,该事件从其他聊天占用者处获取:

XMPP: DispatchEvents ====> <message id="580735ed335fb760ae0017ec" xmlns="jabber:client" from="18029700-46533@chat.quickblox.com/1220770403-quickblox-68179" type="chat" to="18976912-46533@chat.quickblox.com"><extraParams xmlns="jabber:client"><save_to_history>1</save_to_history><dialog_id>5800aea1a28f9a1c1f000010</dialog_id><message_id>580735ed335fb760ae0017ec</message_id><date_sent>1476867565</date_sent></extraParams><body>test+message</body><thread>5800aea1a28f9a1c1f000010</thread></message>
XMPP: OnMessageReceived ====>  From: 18029700 To: 18976912 Body:  DateSent 1476867565 FullXmlMessage: <message id="580735ed335fb760ae0017ec" xmlns="jabber:client" from="18029700-46533@chat.quickblox.com/1220770403-quickblox-68179" type="chat" to="18976912-46533@chat.quickblox.com"><extraParams xmlns="jabber:client"><save_to_history>1</save_to_history><dialog_id>5800aea1a28f9a1c1f000010</dialog_id><message_id>580735ed335fb760ae0017ec</message_id><date_sent>1476867565</date_sent></extraParams><body>test+message</body><thread>5800aea1a28f9a1c1f000010</thread></message>

因为你可以看到Body部分进入事件OnMessageReceived是空的! 但是这个片段末尾的html部分包含消息“test + message”

这是PrivateChat类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using QbChat.Pcl.Repository;
using Quickblox.Sdk.GeneralDataModel.Models;
using Quickblox.Sdk.Modules.ChatXmppModule;
using Quickblox.Sdk.Modules.UsersModule.Models;
using UIKit;
using Xmpp.Im;

namespace KeepInTouch.iOS
{
    public partial class PrivateChat : BaseChat
    {
        PrivateChatManager privateChatManager;

        public PrivateChat(string dialogId, string nibname) : base(dialogId, nibname) { }

        public async override void ViewWillAppear(bool animated)
        {
            base.ViewWillAppear(animated);
            AppDelegate.R.NavController.SetNavigationBarHidden(true, true);
            await MessageProvider.Reconnect();
        }

        public override void ViewDidLoad()
        {
            base_tb_chat = tb_chat;
            base_txt_chat = txt_chat;
            base.ViewDidLoad();
            view_top.BackgroundColor = UIColor.FromPatternImage(UIImage.FromFile("navbar_top_kit.png"));
            tb_chat.TableFooterView = new UIView();
            IsBusyIndicatorVisible = true;
            var dialog = Database.Instance().GetDialog(dialogId);
            var opponentId = dialog.OccupantIds.Split(',').Select(int.Parse).First(id => id != QbChat.UserId);
            ChatXmppClient xmpc = QbChat.QbProvider.GetXmppClient();
            privateChatManager = xmpc.GetPrivateChatManager(opponentId, dialogId);
            privateChatManager.MessageReceived += OnMessageReceived;
            DialogName = dialog.Name;

            //xmpc.MessageReceived += OnMessageReceived;

            btn_chat.TouchUpInside += async delegate {
                await SendMessageCommandExecute();
                txt_chat.Text = "";
            };

            txt_chat.ShouldReturn += (textField) => {
                textField.ResignFirstResponder();
                return true;
            };

            txt_chat.EditingChanged += async delegate {
                MessageText = txt_chat.Text;
                await MessageProvider.Reconnect();
            };

            btn_back.TouchUpInside += delegate {
                DismissViewController(false, null);
            };

            IsBusyIndicatorVisible = true;

            Task.Factory.StartNew(async () => {
                var users = await QbChat.QbProvider.GetUsersByIdsAsync(dialog.OccupantIds);
                var opponentUser = users.FirstOrDefault(u => u.Id != QbChat.UserId);
                if (opponentUser != null && opponentUser.BlobId.HasValue) {
                    await QbChat.QbProvider.GetImageAsync(opponentUser.BlobId.Value).ContinueWith((task, result) => {
                        //var bytes = 
                        task.ConfigureAwait(true).GetAwaiter().GetResult();
                    }, TaskScheduler.FromCurrentSynchronizationContext());
                }
                opponentUsers = new List<User> { opponentUser };
                await LoadMessages();
                InvokeOnMainThread(() =>
                    IsBusyIndicatorVisible = false
                );
            });
        }

        async void OnMessageReceived(object sender, MessageEventArgs messageEventArgs)
        {
            if (messageEventArgs.MessageType == MessageType.Chat ||
                messageEventArgs.MessageType == MessageType.Groupchat) {
                string decodedMessage = System.Net.WebUtility.UrlDecode(messageEventArgs.Message.MessageText);
                var messageTable = new MessageTable();
                messageTable.SenderId = messageEventArgs.Message.SenderId;
                messageTable.DialogId = messageEventArgs.Message.ChatDialogId;
                messageTable.DateSent = messageEventArgs.Message.DateSent;
                if (messageEventArgs.Message.NotificationType != 0) {
                    if (messageEventArgs.Message.NotificationType == NotificationTypes.GroupUpdate) {
                        if (messageEventArgs.Message.AddedOccupantsIds.Any()) {
                            var userIds = new List<int>(messageEventArgs.Message.AddedOccupantsIds);
                            userIds.Add(messageEventArgs.Message.SenderId);
                            var users = await QbChat.QbProvider.GetUsersByIdsAsync(string.Join(",", userIds));
                            var addedUsers = users.Where(u => u.Id != messageEventArgs.Message.SenderId);
                            var senderUser = users.First(u => u.Id == messageEventArgs.Message.SenderId);
                            messageTable.Text = senderUser.FullName + " added users: " + string.Join(",", addedUsers.Select(u => u.FullName));
                        } else if (messageEventArgs.Message.DeletedOccupantsIds.Any()) {
                            var userIds = new List<int>(messageEventArgs.Message.DeletedOccupantsIds);
                            var users = await QbChat.QbProvider.GetUsersByIdsAsync(string.Join(",", userIds));
                            messageTable.Text = string.Join(",", users.Select(u => u.FullName)) + " left this room";
                        }
                        //var dialogInfo = await QbChat.QbProvider.GetDialogAsync(messageEventArgs.Message.ChatDialogId);
                        //if (dialogInfo == null)
                        //{
                        //    return;
                        //}
                        //var dialog = new DialogTable(dialogInfo);
                        //Database.Instance().SaveDialog(dialog);
                    }
                } else {
                    messageTable.Text = decodedMessage;
                }

                await SetRecepientName(messageTable);

                Messages.Add(messageTable);

                InvokeOnMainThread(async () => {
                    tb_chat.ReloadData();
                    await ScrollList();
                });
            }
        }

        public async Task LoadMessages()
        {
            List<Message> messages;
            try {
                messages = await QbChat.QbProvider.GetMessagesAsync(dialogId);
            } catch (Exception ex) {
                Console.WriteLine(ex);
                return;
            }

            if (messages != null) {
                messages = messages.OrderBy(message => message.DateSent).ToList();
                foreach (var message in messages) {
                    var chatMessage = new MessageTable();
                    chatMessage.DateSent = message.DateSent;
                    chatMessage.SenderId = message.SenderId;
                    chatMessage.MessageId = message.Id;
                    if (message.RecipientId.HasValue)
                        chatMessage.RecepientId = message.RecipientId.Value;
                    chatMessage.DialogId = message.ChatDialogId;
                    chatMessage.IsRead = message.Read == 1;
                    await SetRecepientName(chatMessage);
                    chatMessage.Text = System.Net.WebUtility.UrlDecode(message.MessageText);
                    InvokeOnMainThread(() =>
                        Messages.Add(chatMessage)
                    );
                }

                InvokeOnMainThread(async () => {
                    tb_chat.ReloadData();
                    await ScrollList();
                });
            }
        }

        async Task SendMessageCommandExecute()
        {
            var message = MessageText != null ? MessageText.Trim() : string.Empty;
            if (!string.IsNullOrEmpty(message)) {
                var m = new MessageTable();
                m.SenderId = QbChat.UserId;
                m.Text = message;
                m.DialogId = dialogId;
                m.RecepientFullName = "Me";
                try {
                    await MessageProvider.Reconnect();
                    var encodedMessage = System.Net.WebUtility.UrlEncode(message);
                    privateChatManager.SendMessage(encodedMessage);
                } catch (Exception ex) {
                    Console.WriteLine(ex);
                    return;
                }
                long unixTimestamp = DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1).Ticks;
                unixTimestamp /= TimeSpan.TicksPerSecond;
                m.DateSent = unixTimestamp;
                m.ID = Database.Instance().SaveMessage(m);
                var dialog = Database.Instance().GetDialog(dialogId);
                dialog.LastMessage = m.Text;
                dialog.LastMessageSent = DateTime.UtcNow;
                Database.Instance().SaveDialog(dialog, true);
                Messages.Add(m);
                MessageText = "";
                InvokeOnMainThread(async () => {
                    tb_chat.ReloadData();
                    await ScrollList();
                });
            }
        }

        public override void DidReceiveMemoryWarning()
        {
            base.DidReceiveMemoryWarning();
        }
    }
}

长话短说sdk接收消息但显然无法解析正文消息。触发处理程序,但如果为空则不调用privateChatManager.MessageReceived。

有人可以帮忙吗? 谢谢

0 个答案:

没有答案