Skip to content
v1
文档/Android SDK/开发指南

推送服务(Push)

Android 离线推送由独立的 imsdk-push 提供。核心 imsdk 负责 IM 连接和消息同步,imsdk-push 负责 Token 缓存、账号绑定、重试和清理。

小米、华为、OPPO、vivo 和荣耀通过独立 Provider 模块按需接入。Provider 负责对应厂商 SDK 的初始化和 Token 获取,imsdk-push 统一负责 Token 缓存、账号绑定、重试和清理。

模块关系

text
宿主 App
├── chat(imsdk)
├── imsdk-push
└── imsdk-push-<vendor>(按需选择一个厂商 Provider)

imsdk-push 不依赖核心 imsdk,但与 chat 一起使用时会自动感知 IM 登录、登出和账号切换。宿主不需要传入 BimImManager,也不需要使用旧的 Push Bridge 模块。

接入前准备

开发者需要先到具体推送厂商的控制台申请并配置应用凭据:

  • 小米:申请 AppIdAppKey,并确保应用包名、签名证书与小米控制台配置一致。
  • 华为:在 AppGallery Connect 创建应用,配置包名和签名指纹,并下载 agconnect-services.json
  • OPPO:开通 OPPO PUSH,按当前客户端 SDK 要求准备 AppKeyAppSecret
  • vivo:开通 vivo 消息推送,准备 AppIdApiKey
  • 荣耀:开通 HONOR Push,准备 AppId;使用 mcs-services.json 时还需要按荣耀文档配置插件。

厂商配置、包名和签名不匹配时,Token 获取或通知送达可能失败。用于服务端鉴权和消息下发的 MasterSecretClientSecret 等凭据不能写入 Android 工程或 APK。OPPO 客户端注册参数以所用 OPPO Push SDK 版本的官方文档为准,不要混用服务端 MasterSecret

Gradle 依赖

所有 IMSDK 模块使用同一版本。基础接入至少声明核心和 Push 基础模块:

kotlin
dependencies {
    implementation("com.beework.im:chat:<version>")
    implementation("com.beework.im:imsdk-push:<version>")
}

按设备渠道选择一个厂商 Provider:

kotlin
dependencies {
    implementation("com.beework.im:imsdk-push-xiaomi:<version>")
    // implementation("com.beework.im:imsdk-push-huawei:<version>")
    // implementation("com.beework.im:imsdk-push-oppo:<version>")
    // implementation("com.beework.im:imsdk-push-vivo:<version>")
    // implementation("com.beework.im:imsdk-push-honor:<version>")
}

没有使用的厂商模块不要引入,否则对应厂商 SDK 和 Manifest 组件也会进入宿主构建产物。

初始化 Push

建议在 Application.onCreate() 中、隐私授权和厂商配置完成后显式注册:

kotlin
val push = BimPushManager.getInstance().registerPush(
    context = applicationContext,
    config = XiaomiPushConfig(
        appId = "<xiaomi-app-id>",
        appKey = "<xiaomi-app-key>",
    ),
)

也可以使用厂商模块提供的便捷入口:

kotlin
XiaomiPush.register(
    context = applicationContext,
    appId = "<xiaomi-app-id>",
    appKey = "<xiaomi-app-key>",
)

autoRegister 默认开启。传入 false 时只初始化 Provider,不自动请求 Token;宿主仍可通过 Provider 或 Push Manager 的公开能力触发后续操作。

Push 状态与点击事件

kotlin
val manager = BimPushManager.getInstance()

val status = manager.getStatus(BimPushProvider.XIAOMI)
val diagnostic = manager.getDiagnostic(BimPushProvider.XIAOMI)

manager.addPushClickListener { event ->
    // 根据 event.uri 和 event.extras 跳转到业务页面
}

BimPushStatus 用于表达 NOT_CONFIGUREDINITIALIZINGTOKEN_CACHEDSYNCINGSYNCEDFAILED 等状态;BimPushDiagnostic 只提供状态、是否有 Token 和脱敏错误信息。

各厂商 Provider 会将通知点击事件转换为 BimPushClickEvent。SDK 内部拥有统一点击路由组件,宿主只负责业务页面路由,不需要声明厂商专用 Scheme。Push SDK 不替宿主实现业务页面。

生命周期与错误边界

  • chat 同进程使用时,IM 登录成功后 Push 自动绑定当前账号和设备会话;登出或认证失效时清理当前账号的服务端 Push 设置。
  • Push 初始化、Token 获取、网络同步或清理失败不会阻断 IM 初始化、登录和消息收发。
  • 账号切换时,旧账号的 Token 不会继承到新账号;Token 更新、去重、重试和清理由 imsdk-push 负责。
  • 宿主销毁 Push runtime 时调用 BimPushManager.getInstance().release()

公开基础接口

kotlin
class BimPushManager : BimPushService {
    fun registerPush(
        context: Context,
        config: BimPushConfig,
        autoRegister: Boolean = true,
    ): BimPushManager

    suspend fun reportToken(token: BimPushToken)
    suspend fun clearToken(provider: BimPushProvider)
    fun getStatus(provider: BimPushProvider): BimPushStatus
    fun getDiagnostic(provider: BimPushProvider): BimPushDiagnostic
    fun addListener(listener: BimPushListener)
    fun removeListener(listener: BimPushListener)
    fun addPushClickListener(listener: BimPushClickListener)
    fun removePushClickListener(listener: BimPushClickListener)
    fun release()
}

reportToken 适用于自定义厂商或宿主已有推送通道的场景。标准厂商接入优先使用对应 Provider 模块。详细配置见: