Skip to content

把聊天嵌进自己的页面 ​

想让客服对话带上你自己的标题栏,或者和别的内容放在同一屏,用这一档。

什么时候需要这一档 ​

这是四种形态里最底层的一档:SDK 只给你一个视图,容器、标题栏、生命周期都由你安排。适合对话只占屏幕一部分、旁边还有别的内容的场景。

先确认你真的需要它。 只是想把客服做成一个 Tab、或者带上自己的标题栏,Android 用 HecongChatFragment、iOS 直接摆 HecongChatViewController 就够了,选文件、权限、返回键这些 SDK 内部已经处理好,做法见聊天页的四种形态。

自己摆 HecongChatView 的代价是有几个宿主回调要你转发。漏掉哪个的症状都比较隐蔽,下面逐条列出来。

Android ​

把 HecongChatView 放进你的布局,然后转发四件事。

转发选择文件的结果 ​

kotlin
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    chatView.onActivityResult(requestCode, resultCode, data)
}

不转发的症状:客户点发图片完全没反应,选完照片回来什么也没发生。

转发权限申请的结果 ​

kotlin
override fun onRequestPermissionsResult(
    requestCode: Int, permissions: Array<String>, grantResults: IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    chatView.onRequestPermissionsResult(requestCode, permissions, grantResults)
}

不转发的症状:客户在权限弹窗上点了允许,录音还是用不了。

前后台联动 ​

kotlin
override fun onStart() { super.onStart(); chatView.onHostStart() }
override fun onStop() { super.onStop(); chatView.onHostStop() }

不转发的症状最隐蔽:合从会一直认为这位客户在线,离线推送一条都不发,工作台里他的在线状态长亮。原因是 WebView 里的心跳在后台照常应答,合从没法凭连接判断人还在不在看屏幕。

必须用 onStop,不要用 onPause

分屏、盖弹窗、下拉通知栏都会触发 onPause,而那时客户还看着屏幕。在 onPause 里断开等于人没走却被判成离开。

释放 ​

kotlin
override fun onDestroy() { chatView.destroy(); super.onDestroy() }

键盘不用你管 ​

SDK 会在视图挂载时把当前 Activity 的软键盘模式设成 adjustResize,离开时还原成你原来的值。你不需要改 AndroidManifest.xml,也不用担心影响 APP 里的其他页面。

iOS ​

iOS 用 HecongChatViewController,自己嵌进容器或者做成子控制器。前后台切换由 SDK 内部处理,你不需要转发任何东西。

键盘避让和安全区适配同样在 SDK 内部完成。

标题栏不会重复 ​

SDK 默认不画自己的标题栏,因为它假设你的页面已经有导航栏了。所以你在自己的布局里加标题栏,不用做任何设置,也不会出现上下两条。

宿主自己绘制的标题栏,含返回按钮、客服头像、昵称与签名,下方是对话内容

反过来,如果嵌入的位置没有导航栏、你希望客服界面自己画一条,在配置里传:

kotlin
config.extraQuery["hh"] = "0"

标题栏上显示的昵称头像会随会话变化(会话前是渠道身份,客服接起后变成客服本人),自己画的话这些数据从回调里拿,见接口速查。

用了自己的返回按钮就要接一下 ​

你自己画的标题栏上的返回按钮,点击时先问一下 SDK:

kotlin
if (!chatView.handleBackPressed()) {
    finish()   // SDK 说没有可关的层,才真的退出
}
swift
if !chat.handleBackPressed() {
    navigationController?.popViewController(animated: true)
}

返回 true 表示 SDK 关掉了自己内部的一层(比如客户正开着图片预览),这时你不要再退出页面。

Android 的实体返回键同理,在 onBackPressed 里先转发。

不接的症状:客户正在看客服发来的大图,点返回直接被踢出整个客服页面。

下一步 ​