Appearance
兼容性核对
接之前先在这一页对一遍,确认和你的 APP 现有的兼容范围不冲突。
最低系统版本
| 端 | 要求 | 低于这条线会怎样 |
|---|---|---|
| Android | API 21(Android 5.0) | 编译期就失败,清单合并时报 minSdk 冲突 |
| iOS | iOS 13 | 添加依赖时失败,Swift Package Manager 报平台不满足 |
不会出现「装上了但用不了」 —— 版本不兼容在你构建阶段就暴露出来,不会带到用户手上。
部分功能的门槛比这条线高,见下面对系统版本另有要求的功能。
Android 侧要核对什么
构建环境
你的工程 compileSdk 30 及以上就能接入。
下面这套是合从自己的构建环境,列出来供你对照,不是对你的要求:
| 项 | 合从的构建环境 |
|---|---|
compileSdk | 35 |
| Android Gradle Plugin | 8.x |
| Gradle | 8.x |
| Java 兼容性 | 1.8,不需要开启 desugaring |
你的工程不需要用 Kotlin,纯 Java 工程可以直接接入。
三方依赖
SDK 只依赖两个库,写的都是最低能用的版本:
| 依赖 | 最低版本 |
|---|---|
org.jetbrains.kotlin:kotlin-stdlib | 1.9.23 |
androidx.core:core | 1.6.0 |
没有任何非 AndroidX 的三方库 —— 不带网络库、JSON 库、图片库,这些都用系统自带的能力实现。
androidx 依赖以 implementation 方式引入,不会进入你的编译期类路径。合从不设版本上限,你的工程里有更高版本时按 Gradle 常规规则取高的那个,不用为合从降级。
包体积
AAR 本身 230 KB 以内(不含依赖)。
不含任何原生库(没有 .so),所以不影响你的 ABI 分包策略,也不会因为架构而成倍增加体积。
混淆
不用加任何混淆规则。 SDK 自带的规则会随依赖自动合并进你的工程,保护跨语言调用的方法名不被混淆。
权限
SDK 自身不声明任何权限。 麦克风、相机这些由你按用到的功能在自己的 AndroidManifest.xml 里声明并运行时申请:
| 权限 | 什么时候需要 |
|---|---|
RECORD_AUDIO + MODIFY_AUDIO_SETTINGS | 要让客户发语音消息,两条成对声明 |
CAMERA | 要让客户直接拍照或拍视频发给客服 |
只让客户打字和发相册照片的话,一条都不用声明。
语音那两条缺一不可:只声明 RECORD_AUDIO 时,客户点了 允许 仍会看到麦克风被占用的提示,重试和重启都没用。MODIFY_AUDIO_SETTINGS 是普通权限,装上就有,不弹窗。
SDK 会往你的清单里合并什么
| 组件 | 说明 |
|---|---|
HecongChatActivity | 客服页面容器,exported="false",已配好软键盘模式 |
HecongChatSheetActivity | 弹层档的承载页,同样 exported="false" |
FileProvider | 拍照时用来接收照片,authority 按你的应用 ID 派生(<你的applicationId>.hecong.capture),不会和你自己的 FileProvider 冲突 |
这些都不用你在自己的清单里声明。
设备需要启用系统 WebView
客服界面依赖 Android 的系统 WebView 组件(「Android System WebView」)。极少数设备允许用户在应用管理里停用它,停用后客服功能无法使用。
这种情况非常少见,多数用户不会去动这个组件。遇到这种设备时 SDK 会显示一张提示页引导用户去启用,并通过 onLoadFailed 回调通知你的 APP,你可以据此隐藏客服入口。
键盘适配的降级开关
Android 11 及以上,客服页用系统的新式适配处理键盘和状态栏:键盘弹出时输入框逐帧跟随,页面铺到状态栏下面。这是默认行为,不用配。
个别定制系统上这套机制表现异常时,把 modernInsets 配成 false 退回传统的整页顶起方式:
kotlin
HecongChatConfig("你的渠道ID").apply { modernInsets = false }Android 10 及以下本来就走传统方式,这个开关对它们没有影响;嵌进自己页面的那一档也不受影响,那时键盘由你的容器负责。
开了新式返回手势也不影响
Android 13 起系统有一套新的返回回调机制,工程在清单里开了 enableOnBackInvokedCallback 之后,传统的 onBackPressed 不再被调用。客服页两套都接了,开不开都能正常返回,预测式返回动画也保留着。
自己摆容器的那一档要注意:你的返回按钮仍要先问一次 SDK,见把聊天嵌进自己的页面。
多进程 APP 要多做一步
多进程架构不处理会直接崩溃
Android 不允许同一个 APP 的多个进程同时使用 WebView,触发时抛出:
Using WebView from more than one process at once with the same data directory is not supported这是 Android 平台的限制。你的 APP 如果是多进程架构(电商、IM 类常见),要在任何 WebView 被创建之前——通常是 Application.onCreate 里——给非主进程设一个数据目录后缀:
kotlin
// Application.onCreate 中,按进程名判断
if (当前进程名 != 主进程名) {
WebView.setDataDirectorySuffix(当前进程名) // 需要 API 28 及以上
}后缀取什么值由你的架构决定,合从不代做 —— SDK 替你定会和你自己的用法打架。
系统备份会把访客身份一起带走
SDK 不声明 allowBackup,跟随你的 APP 设置。你的 APP 开着系统备份时,SDK 存在 SharedPreferences 里的访客标识会被备份并迁移到新设备,表现为用户换手机后聊天记录还在。
这通常是好事。不希望如此的话,在自己的备份规则里排除。
同一个 APP 接多个渠道
技术上可以,同时打开两个不同渠道的客服页面也没问题。三件事要注意:
- 访客身份默认共用。想让两个渠道各算各的客户,给它们配不同的
anonymousIdScope。 identify和resetUser会作用于所有打开着的客服页面,不是只影响其中一个。- 未读跟踪只能跟一个渠道 —— 它按
configure时登记的那份配置走。
构建配置
开启 R8 全模式、资源压缩、App Bundle 分包都不需要额外处理:混淆规则随依赖自动生效,SDK 不带资源文件,也没有原生库参与分包。
访客标识在 Android 上卸载重装会丢失
卸载 APP 会清掉应用数据,没登录过的客户重装后算新访客,看不到之前的对话。iOS 上标识存在钥匙串里,重装仍在。
已经调过 identify 绑定会员的客户不受影响,历史对话跟着会员 ID 走。
对系统版本另有要求的功能
| 功能 | 要求 | 达不到时 |
|---|---|---|
| 语音消息(iOS) | iOS 14.5 及以上 | 录音入口不显示,其余功能正常 |
| 语音消息(Android) | 设备的 Android System WebView 版本较新 | 录音入口不显示,其余功能正常 |
Android 的 System WebView 是可以独立更新的系统组件,和系统版本不是一回事。多数设备会自动更新它,长期不更新的低端机、没有应用商店的定制系统上可能偏旧。详见文件上传限制。
聊天本身不依赖新版内核。内核过旧的设备上,除语音之外的功能照常可用;如果客户反馈显示异常,引导他更新「Android System WebView」这个组件。
写应用市场文案时按功能分别限定
「支持 iOS 13 / Android 5.0」说的是聊天本身。语音消息的门槛更高,承诺时要单独写清楚,不要笼统写成整个客服功能的支持范围。
iOS 侧要核对什么
通过 Swift Package Manager 引入,不引入任何三方库。Swift Package Manager 只在编译期工作,不会抬高你的 APP 的运行时最低版本要求。
需要 Xcode 13 及以上。你的工程不需要写 Swift,Objective-C 工程可以直接接入,写法见装进 iOS。
需要在 Info.plist 里补麦克风和相机的用途说明,见装进 iOS。
重复初始化不会有问题
configure 可以重复调用,后一次覆盖前一次的配置。Application 被系统重建、或者你在多个入口各调了一次,都不会出问题。
升级 SDK 要做什么
改依赖里的版本号,重新构建。接口有变动的版本会在版本说明里写明改什么,照着调整即可。
工作台里改配置不需要重新发版 —— 外观、欢迎语、自动回复、表单这些改完对新会话立即生效,客户也不用更新 APP。需要发版的只有一种情况:你要用 SDK 新增的接口。
新增的会话事件不需要升级 SDK 就能收到,前提是接了通用回调,见监听会话事件。
下一步
- 装进 Android
- 装进 iOS
- 权限说明与应用市场审核
- 隐私合规与信息公示 —— 上架前要准备的材料