Appearance
聊天页里的外链与拨号
客服发来一个商品链接,客户点了 —— 是跳出去开浏览器,还是留在你的 APP 里打开?这由你决定。
默认行为
客户在聊天里点了往外走的东西,SDK 交给系统处理:网址开系统浏览器,电话号码唤起拨号盘,邮箱地址打开邮件应用。支持的协议是 http、https、tel、mailto、sms 和 geo,其余协议一律不放行。
聊天页本身不会被这些跳转顶掉。 客户点完回到 APP,客服对话还在原处,聊天记录和输入到一半的内容都不会丢。
不需要额外接入就是这个行为。想改成跳你自己 APP 内的页面,才需要下面这一步。
用一个回调全接管
聊天页里所有往外跳的动作 —— 消息里的网址、卡片上的链接、电话、邮箱、短信 —— 都走同一个回调。实现它就覆盖了全部,不用分辨这一条是从哪来的:
kotlin
// Android
override fun onOpenUrl(url: String): Boolean {
// 返回 true = 你自己处理了,SDK 不再做默认动作
return false
}swift
// iOS
func hecongChat(handleOpenUrl url: URL) -> Bool {
return false
}典型用法是把自家域名的链接留在 APP 内打开:客服发来一个商品链接,客户点开直接进你 APP 的商品详情页,而不是跳去浏览器看网页版。
只接管网页时要按协议判断
一律返回 true 会把拨号和发邮件一起吞掉
这个回调收到的不只是网页地址,tel:、mailto:、sms: 也走这里。如果你的实现是无条件 return true(本意只是想拦住网页链接),客户点客服发来的电话号码会毫无反应 —— 你接管了,但没有处理它。
正确做法是先看协议,只接管你真正要处理的那部分,其余交回给 SDK:
kotlin
// Android
override fun onOpenUrl(url: String): Boolean {
val uri = Uri.parse(url)
if (uri.host == "example.com") {
openInMyApp(uri) // 自家链接,APP 内打开
return true
}
return false // 电话、邮箱、外部网址交回 SDK
}swift
// iOS
func hecongChat(handleOpenUrl url: URL) -> Bool {
guard url.host == "example.com" else { return false }
openInMyApp(url)
return true
}附件下载
客户点下载客服发来的文件,走另一个回调,规则一样 —— 返回 true 表示你自己处理,不接管就由系统下载:
kotlin
// Android
override fun onDownload(url: String, filename: String?): Boolean = falseswift
// iOS
func hecongChat(handleDownload url: URL, filename: String?) -> Bool { false }回调设在哪都收得到
无论你是把回调设在 HecongChat 上,还是设在自己嵌入的聊天视图上,两处都会被问到,任意一处返回 true 就算接管。同一个对象在两处都设了也不会被问两遍。
自己嵌视图的接法见嵌进自己的页面。