leancloud / realtime-SDK-dotNET

LeanCloud Instants Messaging SDK for Portable & Unity & .NET Core written by c#
Apache License 2.0
13 stars 9 forks source link

新增 AutoRead 属性遇到的问题 #93

Closed onerain88 closed 6 years ago

onerain88 commented 6 years ago

默认为 true 时,收到消息的 UnreadState.Count 并未自动归 0,重新登录后也未归 0 image image

onerain88 commented 6 years ago

OfflineMessageStrategy 和 AutoRead 是否有重合

wujun4code commented 6 years ago

如果废弃 v1 和 v2

用户的代码如下:

var realtime = new AVRealtime()
{
    var realtimeConfig = new AVRealtime.Configuration()
    {
         ApplicationId = appId,
         ApplicationKey = appkey,
         OfflineMessageStrategy = AVRealtime.OfflineMessageStrategy.UnreadAck,
     };
     realtime = new AVRealtime(realtimeConfig);
};

场景区分

1.不关心离线消息,不关心是否已读

在登录之后,不用做任何操作。

2.关心离线消息,但是不关心是否已读,这种场景下收到既已读

确保本次在线的时候,AutoRead 为 Ture 那么在下次登录的时候,可以通过查阅 conversation.Unread 来读取离线消息(此时未读就是等于离线消息)

client.GetConversationAsync("convId").ContinuteWith(t =>
{
       var latestUnreadMessage = conversation.Unread.LastMessage;
       var unreadCount = conversation.Unread.Count;
       return conversation.QueryMessage(limit:unreadCount ,beforeMid:latestUnreadMessage.Id);
}).Unwrap().Continute(s =>
{
       // 这里一定是离线消息
       var offlineMessages = s.Result;
});

3. 区分已读和已接收

登录之后,确保本次在线的时候将 AutoRead 设置为 False

参照上述 2 可以获取离线期间产生的未读消息(也是离线消息)。 然后在接收到消息之后,手动调用:

conversation.ReadAsync()

并且可以通过 conversation.Unread 读取所有的未读消息,它将包含三部分:

  1. 上次在线收到,但是未手动标记 conversation.ReadAsync() 那部分消息
  2. 上次离线之后收到的离线消息
  3. 本次在线收到的消息,但是也未标记 conversation.ReadAsync() 这一部分消息

以上三种消息,SDK 内部做了合并。

wujun4code commented 6 years ago

96