通知点了不跳页,Push Kit的token和路由各有各的脾气
推送接进去,测试消息能收到,但用户点通知栏,应用打开了,停在首页,没有跳到详情页。或者更奇怪:前台收到推送,通知栏弹一条,用户点进去又走了一遍 onCreate,路由参数丢了。再或者,卸载重装之后推送彻底收不到了,服务端还在往旧 token 发。Push Kit 的问题很少是“推不到”,更多是“收到了但接不住”:token 的生命周期、点击参数的解析、前台消息的分流,各自有各自的契约。
先处理 token。pushService.getToken() 应该在 EntryAbility 的启动阶段调用,拿到之后立刻上报业务服务端。但token 不是一次拿完就永久有效的:卸载重装、清除应用数据、设备升级、账号切换都可能让它变化。只在上报一次、服务端只存首次取号结果的实现,重装之后就等着收不到推送。正确的做法是启动时取号上报,同时监听 newToken 事件,变了就同步。
typescript
import { pushService } from '@kit.PushKit'
import { BusinessError } from '@kit.BasicServicesKit'
import { hilog } from '@kit.PerformanceAnalysisKit'
const DOMAIN = 0x0001
export default class EntryAbility extends UIAbility {
onCreate(): void {
this.obtainToken()
this.listenTokenChange()
}
private obtainToken(): void {
pushService.getToken()
.then((token: string) => {
hilog.info(DOMAIN, 'push', 'get token success')
this.reportToken(token)
})
.catch((err: BusinessError) => {
hilog.error(DOMAIN, 'push', `get token fail ${err.code} ${err.message}`)
})
}
private listenTokenChange(): void {
try {
pushService.on('newToken', (token: string) => {
hilog.info(DOMAIN, 'push', 'token rotated')
this.reportToken(token)
})
} catch (err) {
const e = err as BusinessError
hilog.error(DOMAIN, 'push', `listen newToken fail ${e.code}`)
}
}
private reportToken(token: string): void {
// 上报业务服务端,按账号维护 token,而不是只追加不清理
}
}
getToken 返回空或者报错,先查 module.json5 里的 client_id 配没配、Push 服务在 AGC 开没开、设备有没有登录华为账号。常见错误是换了包名或换了 AGC 项目之后没重新申请 Profile,旧 token 直接无效。服务端侧还要清理失效 token,不能只 bind 不 unbind,多设备场景下否则会出现“A 账号收到 B 账号的消息”。
点击跳转靠clickAction和skills,不要自己猜
通知点击之后往哪儿跳,由消息里的 clickAction 数据和应用的 skills 配置共同决定。用 https 通用链接承接比自定义 scheme 更稳,skills 里 uris 的 host 和 pathStartsWith 要和推送里下发的跳转地址对得上。如果通知点了停在首页,先确认 clickAction 里的参数有没有被应用侧正确读取,而不是只把通知点开就完事。
前台消息还有一个分流问题:receiveMessage 回调里如果既弹了本地通知,又让系统默认展示,就会出现重复弹窗。需要按消息类型决定是走通知栏还是走透传,不要两套都触发。离线消息不补发也不是都怪服务端,用户关了通知权限、开了免打扰、消息被归到营销类,都会影响展示,测试时先用测试消息通道排除权益和频率限制的干扰。
推送这条链路上,token 是入口,clickAction 和 skills 是出口,中间的前台/后台分流是岔路口。把 token 的轮换监听加上、把 clickAction 的落地页对清楚、把前台消息的去重做好,比反复怀疑“推送服务不稳定”有效得多。
更多推荐
所有评论(0)