离线推送
原生推送通过 im-push 接入,用户免打扰设置见提醒与举报。需要先在租户控制台配置应用的推送凭据。
初始化
import com.deeprespond.im.*
import com.deeprespond.im.push.*
val options = DRClientOptions(
appKey = "org#app",
apiUrl = "https://api.example.com",
push = DRPushOptions(
credentials = mapOf(PushChannel.FCM to "控制台凭据编号"),
),
)credentials 的值为控制台凭据编号,不是厂商服务端密钥。用户同意隐私政策后初始化,在主进程登记。初始化后用 DRPush.of(im) 获取控制器,未给 push 选项或未引入扩展时返回 null。
FCM
App 配置 Firebase 项目和 google-services.json,并初始化 Firebase。SDK 提供 DRFirebaseMessagingService;已有自己的服务时,清单合并中只保留一个有效的 FCM 接收服务,在 AndroidManifest.xml 中移除 SDK 默认服务,并声明业务服务:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<service android:name="com.deeprespond.im.push.DRFirebaseMessagingService"
tools:node="remove" />
<service android:name=".AppMessagingService" android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
</application>
</manifest>在业务服务中转交 SDK 消息:
import com.deeprespond.im.push.DRPush
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
class AppMessagingService : FirebaseMessagingService() {
override fun onMessageReceived(message: RemoteMessage) {
if (!DRPush.handleRemoteMessage(this, message)) {
// 处理 App 自己的其他推送。
}
}
override fun onNewToken(token: String) {
DRPush.handleNewToken(this, token)
}
override fun onDeletedMessages() {
DRPush.handleDeletedMessages(this)
}
}对提供 onRegistered / onUnregistered 的 Firebase 版本,分别转交 handleRegistered(context, installationId) 与 handleUnregistered(context)。FID 登记还依赖服务端能力与 App 配置,未启用时仍按令牌登记,不能只替换客户端 API 就假定通道可用。
国内厂商
| 通道 | 制品 | VendorPush 构造 | App 配置 |
|---|---|---|---|
| 华为 | im-push-huawei | HuaweiPush() | HMS / AGConnect 配置和 Huawei 仓库 |
| 荣耀 | im-push-honor | HonorPush() | 清单 com.hihonor.push.app_id 和 Honor 仓库 |
| 小米 | im-push-xiaomi | XiaomiPush(appId, appKey) | App 加入真实厂商 SDK |
| OPPO | im-push-oppo | OppoPush(appKey, appSecret) | App 加入真实厂商 SDK |
| vivo | im-push-vivo | VivoPush() | 清单 com.vivo.push.app_id、com.vivo.push.api_key 和 vivo 仓库 |
| 魅族 | im-push-meizu | MeizuPush(appId, appKey) | 厂商应用配置和真实依赖 |
类位于 com.deeprespond.im.push.<厂商>。将实例传入 DRPushOptions.vendors,credentials 同时给出对应通道的凭据编号。这些构造参数是厂商要求的客户端配置,与控制台中服务端凭据不同。
华为、荣耀、vivo 的 Maven 仓库分别为 https://developer.huawei.com/repo/、https://developer.hihonor.com/repo、https://repos.vivo.com.cn/maven/repository/external-lib/,可按依赖组限制范围。小米、OPPO 从厂商取得真实 AAR,使用 App 的 libs 或私有仓库;源码中的 vendor-stubs 只是编译桩,不能作为真实运行依赖。
当前厂商模块已有编译与模拟验证,真实通道、通知分类、点击、角标和省电策略仍需厂商账号与真机验收。
通知权限与渠道
Android 13 起由 App 在合适时机申请通知权限;通知渠道被用户关闭时也可能收不到提醒。控制器的 permission() 返回 GRANTED / DENIED / NOT_DETERMINED。推荐在 Activity 创建时用 registerForActivityResult 注册 permissionContract(),由用户操作触发 launch(Unit),旋转屏幕时结果仍由生命周期恢复;也可在协程中调用 requestPermission(activity)。自己请求过权限时调用 markPermissionRequested(),拒绝后用 shouldShowRationale(activity) 判断是否还能再次请求。
DRPushOptions.androidChannels 默认 dr_message、dr_call、dr_silent,控制台的通道配置必须与 App 渠道一致。
AndroidChannel 提供 id、name、kind、description、sound,kind 为 MESSAGE / CALL / SILENT。DRPushOptions 还支持 smallIcon、accentColor、language、badge。已创建渠道的声音与用户设置遵循系统规则,不能靠重复初始化覆盖用户选择。
controller.channelStates 观察渠道状态,openNotificationSettings(activity, channelId?) 打开系统设置;isHibernationExempt / openHibernationSettings 检查与打开应用休眠设置。
登记与点击
import com.deeprespond.im.push.DRPush
val controller = DRPush.of(im)
controller?.register()
val registration = controller?.currentRegistration()
val launch = controller?.takeLaunchOpen()
println(registration)
println(launch)register 主动登记当前状态,registrations 订阅登记结果;setEnabled 开关当前设备通知,language 可更新。启动 Activity 的 onCreate / onNewIntent 调用 DRPush.handleIntent(intent);SDK 按点击记录去重。opened 是单消费者流,应在 App 统一入口收集,接收运行中的点击;takeLaunchOpen 读取并消费启动点击。
点击后先恢复 SDK 会话,再按 PushOpened 导航。forCurrentUser 用于识别是否属于当前用户,trusted 标记是否为可信点击;不要让旧账号通知跳进当前账号会话;未知或不匹配目标回到业务首页。
清理通知与角标
clearDeliveredNotifications 清除已发通知(来电除外);cancelNotification(tag) 按标签取消业务自己的通知,dr: 前缀保留给 SDK。BadgeMode.AUTO 根据未读更新,MANUAL 时由业务调用 setBadge(count),count 为 null 清除。角标能力与 ROM 有关;它不等于服务端已读位置。
完整原生入口见DRPushController,与来电相关的权限见音视频通话。
