【问题标题】:SendBird: Search personal chat along with group chatSendBird:搜索个人聊天和群聊
【发布时间】:2021-02-11 01:40:00
【问题描述】:

SendBird 将每个频道都视为他们的GroupChannel。 1:1 聊天在技术上也是一个只有两个用户的GroupChannel(使用isDistinct = true,所以当您再次尝试创建它时它会返回个人聊天)。

我的问题是,我如何通过他们的名字搜索GroupChannels,包括群组和 1:1 聊天?群聊将有一个通用名称,该名称将显示给该组中的所有用户。但是对于 1:1 聊天,GroupChannel 不会有名字,如果有,也不会显示给用户。对于 1:1 聊天,我们总是显示对方的名字(几乎所有聊天系统工作)。

通常,主 UI 列表包含群聊和 1:1 聊天的混合(所有 GroupChannels)。

 --------------------------------
|    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”之类的内容,那么它应该返回名称包含“joh”的所有群聊或对方名称包含“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 频道名称(这很痛苦)。

【问题讨论】:

  • 您可以为 sendbird 返回的搜索结果添加本地过滤器,并使用您的用户名等删除频道。
  • 这也可能行不通,因为有时我可能没有本地所有频道(由于分页功能)。

标签: ios swift sendbird sendbird-ios sendbird-syncmanager


【解决方案1】:

苏尼尔,

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

如果您明确地寻找search,而不是提供用户所属频道的持续列表,您也许可以filter channels by userIds。您必须过滤包含搜索用户和所需用户的频道。

让我们看一个示例,假设您的 userId 是 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)提供通用名称,然后动态生成每个聊天的显示名称。 由于每个频道都返回成员列表,您可以查看成员数组,过滤掉已登录的用户,然后从数组中提取剩余用户的昵称。这将确保无论用户将他们的昵称更改为什么,它始终是准确的,并且您不必在用户更新他们的昵称时更新每个频道。

************ 2010 年 2 月更新 ************

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

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

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

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

【讨论】:

  • 第一种解决方案(使用 userIds 过滤)不起作用;由于用户正在搜索名称和名称映射:id 不是立即可用的(我必须发出 API 请求来获取用户的 id)。
  • 如果我使用nicknameContainsFilter,那么它将返回名称与用户搜索查询不匹配且成员具有这些昵称的所有其他频道。我的意图是让用户搜索一个字符串,该字符串将在 1:1 聊天中搜索频道名称和其他用户。
  • 我不关注您对nicknameContainsFilter 的关注。这样做的目的是查找包含过滤器中昵称的成员的聊天。在您的上下文中,您将包括登录用户昵称以及您正在搜索的用户的昵称。这将返回包含两个用户的任何频道。如果你想使用频道名称,你可以使用channelNameContainsFilter,但是你会遇到用昵称更新频道的问题。
  • 对不起,泰勒,我可能对这个问题不太清楚。我已经用一个例子更新了这个问题。
  • 我根据您的更改使用新信息更新了我的答案。
猜你喜欢
  • 2021-10-26
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多