SendBird:搜索个人聊天和群聊

SendBird: Search personal chat along with group chat

SendBird 将每个频道视为他们的 GroupChannel。 1:1 聊天在技术上也是一个只有两个用户的 GroupChannelisDistinct = true 所以当你试图再次创建它时它会 return 个人聊天)。

我的问题是,如何通过 GroupChannel 的姓名搜索那些包括群组和 1:1 聊天的人?群聊将有一个公共名称,该名称将显示给该组中的所有用户。但是对于 1:1 聊天,GroupChannel 不会有名字,如果有,也不会向用户显示,对于 1:1 聊天,我们总是显示另一个人名(就像几乎所有的聊天系统一样)。

通常 UI 主列表包含群聊和 1:1 聊天(所有 GroupChannel)。

 --------------------------------
|    Search Chat TextField       |
|--------------------------------|
|1  John (1:1)                   |
|2  John's Birthday Plan (group) |
|3  Johnney Eve (1:1)            |
|4  Johansson Fans (group)       |
|  ...                           |
 --------------------------------

所有项目在技术上都是 GroupChannel。请注意,所有 1:1 聊天都没有列表中显示的实际 name。列表中显示的名字是对方的nickname.

期望:

现在,如果用户搜索“joh”之类的内容,那么它应该 return 名称包含“joh”的所有群聊或其他人姓名包含的所有 1:1 聊天“约翰”。 (基本上就是上面例子中的所有项目。)

我的尝试:

我最初的解决方案是将 1:1 频道名称保留为 <user1 nickname> & <user2 nickname>,因此当用户通过他们的名字搜索其他用户时,1:1 频道将看起来就像一个群组频道。

示例代码:

query = SBDGroupChannel.createMyGroupChannelListQuery()
query?.order = .latestLastMessage
query?.limit = 30
query?.channelNameContainsFilter = "joh"
query.loadNextPage(...)

问题:

问题是:

  1. 如果用户搜索他们自己的名字(或只是分隔符 & 或只是一个空格),那么所有个人聊天也会显示,这是无关紧要的。
  2. 我的系统允许用户更改昵称,因此每次用户更改昵称时,所有 1:1 频道名称都必须更新(这很痛苦)。

苏尼尔,

通常,当您为用户 retrieve a list of group channels 时,它会检索该用户可能参与的所有频道(取决于 memberStateFilter)。

如果您明确要 search, rather than providing an ongoing list of channels the user is part of, you may be able to filter channels by userIds。您必须过滤由搜索用户和所需用户组成的频道。

让我们看一个例子,假设您的用户 ID 是 John,并且您正在寻找与 Jay 的聊天:

let listQuery = SBDGroupChannel.createMyGroupChannelListQuery()
listQuery?.userIdsExactFilter = ["John", "Jay"]
listQuery?.loadNextPage(completionHandler: { (groupChannels, error) in
guard error == nil else {
    // Handle error.
}

// Only channelA is returned in a result list through the "list" parameter of the callback method.
...
})

如果您想明确使用 nicknames:

let listQuery = SBDGroupChannel.createMyGroupChannelListQuery()
listQuery?.nicknameContainsFilter = ["John", "Jay"]
listQuery?.loadNextPage(completionHandler: { (groupChannels, error) in
guard error == nil else {
    // Handle error.
}

// Only channelA is returned in a result list through the "list" parameter of the callback method.
...
})

您提到您允许用户更改他们的昵称,因此必须更新房间。可能值得为您的群组频道(甚至 1:1)提供通用名称,然后动态生成每个聊天的显示名称。 由于每个频道 return 都是成员列表,您可以查看成员数组,过滤掉登录的用户,然后从数组中提取剩余用户的昵称。这将确保无论用户将他们的昵称更改为什么,它始终是准确的,并且您不必在用户更新他们的昵称时更新每个频道。

************ 更新时间 02/10 ************

感谢您提供您想要实现的目标的示例。看起来您实际上是在尝试使用 OR 运算符同时搜索 channelNameContainsFilternicknameContainsFilter。这不是我们 (Sendbird) 目前在 iOS SDK 中支持的东西。所以问题是,你能做些什么来实现这个目标?

一种选择是利用平台 API 获取此信息。 List my group channels 具有 search_querysearch_fields 参数,您可以使用该 OR 运算符查找与您的值匹配的频道名称和昵称。

或者,由于 SDK 会 return 过滤这些结果所需的所有必要数据,您可以创建一个前端过滤器,它只会显示与您的过滤结果匹配的项目.因此 SDK return 是完整的频道列表,您存储该列表,然后当用户搜索时,您过滤列表以找到符合您需求的频道并仅显示那些。

附带说明一下,Whosebug 可能不是此类讨论的最佳场所,因为有很多来回。请随时加入我们的社区以获得更多支持。