我当前使用uniapp+vue3开发一个安卓应用,现在需要集成推送功能,因此选择使用uni-push2.0。没有上架应用商店,暂不需要离线推送,只是挂在后台 保持运行能收到推送即可。
现在的情况是,当我第一次运行这个app,进行用户id和获取到的cid进行绑定后,可以正常收到通知,隐藏app 切换到后台也能收到。但是一旦我关闭,重新打开的时候就收不到任何通知了。我确信我正确的初始化和绑定cid了,不然第一次就也不会收到推送了。
我在onlunch进行初始化,我确信cid可以正常获取。
async ensureCid(retry = 0) {
const maxRetry = 6
const wait = ms => new Promise(r => setTimeout(r, ms))
return new Promise((resolve) => {
uni.getPushClientId({
success: async (res) => {
const cid = res?.cid || ''
console.log('[PUSH] getPushClientId success:', cid)
if (!cid) {
if (retry < maxRetry) {
const delay = 600 * Math.pow(1.6, retry)
console.log(`[PUSH] CID空,${delay}ms后重试#${retry+1}`)
setTimeout(() => this.ensureCid(retry + 1).then(resolve),
delay)
} else {
resolve(null)
}
return
}
// 缓存全局和本地存储
const app = getApp()
app.globalData.cid = cid
uni.setStorageSync('cid', cid)
resolve(cid)
},
fail: async (err) => {
console.error('[PUSH] getPushClientId 失败:', err)
if (retry < maxRetry) {
const delay = 800 * Math.pow(1.6, retry)
await wait(delay)
this.ensureCid(retry + 1).then(resolve)
} else {
resolve(null)
}
}
})
})
},
关于绑定,我是在进入到初始页进行绑定,这个绑定我也确信是绑定成功了。
10:05:26.147 [本地调试][云函数:bindClientId]请求参数: {"userId":xxxxxxx","clientId":"xxxxxxxx"}
10:05:26.955 [本地调试][云函数:bindClientId]返回结果: {"code":200,"message":"绑定成功"} .
而且我发现这个cid 如果这个app不重装的话,它是不会变的,那么我觉得问题就不在绑定上了,因为第一次能获取到,而且数据库也有正确的数据,说明绑定是成功的。就是想知道为什么关闭后重新打开就获取不到通知了,问题可能是出现在初始化?但是初始化这里也是成功的。
我是这样推送的。
const res = await uniPush.sendMessage({
push_clientid: clientIds, // 使用 push_clientid
title,
content,
payload: payload || {},
force_notification: true, // 强制生成通知
// category: { // 指定类别(针对厂商通道)
// huawei: "EXPRESS", // 华为通道
// vivo: "ORDER", // vivo 通道
// harmony: "EXPRESS" // 鸿蒙通道
// },
// sound: "default",
// platform: ["app-android"],
});
如果我将force_notification设置为false,那么uni.onPushMessage可以正常js监听,同样也是第一次进入app可以,关闭后重启就不行。
1 个回复
1***@qq.com (作者)
经测试,是设备的问题,换了另一个安卓模拟器,pixel就可以了