一、前言
- 消息推送是小程序的重要功能。比如推送“订单完成”、“欠费缴费”、“异常报警”等通知。
- 同时为了避免垃圾消息骚扰到用户
- 消息内容格式需要在公共模板库中选用
- 推送消息前,需要用户先订阅消息,否则消息推送会失败
二、消息推送流程
- 小程序中不同的功能模块,订阅不同的消息
- 服务器后台根据数据状态,给用户推送消息
- 消息推送位置,在
服务通知
三、订阅消息模板
- 登录小程序
- 功能—>订阅消息
- 选用模块,复制模板ID
四、发起小程序订阅
wx.requestSubscribeMessage(Object object)
参数 | 说明 |
---|---|
tmplIds | 需要订阅的消息模板的 id 的集合,一次调用最多可订阅3条消息 |
success | 接口调用成功的回调函数 |
fail | 接口调用失败的回调函数 |
complete | 接口调用结束的回调函数(调用成功、失败都会执行) |
wx.requestSubscribeMessage({
tmplIds: ['9FmhSwWYIhfgsXvGvvLlH9l-XtQf5WM_61PyDx_e6PU'],
success (res) {
console.log('requestSubscribeMessage success', res)
},
fail (res) {
console.log('requestSubscribeMessage fail', res)
},
})
五、获取用户当前设置
wx.getSetting(Object object)
参数 | 说明 |
---|---|
withSubscriptions | 是否同时获取用户订阅消息的订阅状态,默认不获取。 |
success | 接口调用成功的回调函数 |
fail | 接口调用失败的回调函数 |
complete | 接口调用结束的回调函数(调用成功、失败都会执行) |
wx.getSetting({
withSubscriptions: true,
success (res) {
console.log("getSetting", res)
console.log("getSetting", res.subscriptionsSetting.zrnNqXdbDZFVlhEew5LfQ2nOW8pUG5CdJ4Vw1J__S5Q)
if(res.subscriptionsSetting==null || res.subscriptionsSetting==undefined ||
res.subscriptionsSetting.itemSettings==null || res.subscriptionsSetting.itemSettings==undefined ||
res.subscriptionsSetting["zrnNqXdbDZFVlhEew5LfQ2nOW8pUG5CdJ4Vw1J__S5Q"]!='accept' ||
res.subscriptionsSetting["9FmhSwWYIhfgsXvGvvLlH9l-XtQf5WM_61PyDx_e6PU"]!='accept')
{
console.log("requestSubscribeMessage")
wx.requestSubscribeMessage({
tmplIds: ['9FmhSwWYIhfgsXvGvvLlH9l-XtQf5WM_61PyDx_e6PU', 'zrnNqXdbDZFVlhEew5LfQ2nOW8pUG5CdJ4Vw1J__S5Q'],
success (res) {
console.log('requestSubscribeMessage success', res)
},
fail (res) {
console.log('requestSubscribeMessage fail', res)
},
})
}
}
})
六、理论流程和实际应用
理论上的流程应该是
wx.getSetting(Object object)
获取用户当前设置- 如果是
accept
,就不需要做其他处理 - 如果是
reject
或者无,就wx.requestSubscribeMessage(Object object)
发起消息订阅
- 如果是
但是,实际上你会发现有点参差
- 用户第一次使用,
wx.getSetting(Object object)
没有对应模板ID的记录,于是wx.requestSubscribeMessage(Object object)
发起消息订阅,accept
接收订阅。 - 某特定条件下,后端服务给用户推送消息,用户通过
服务通知
点击进入小程序。 - 二次使用,
wx.getSetting(Object object)
对应模板ID的记录是accept
,于是没有发起消息订阅。 - 某特定条件下,后端服务给用户推送消息,但是,失败了。
- 因为,我们订阅的是
一次性订阅消息
,只能发送一条订阅消息。 - 但是,我们消耗完这一次推送消息的机会后,
wx.getSetting(Object object)
对应模板ID的记录没有改变,依旧是accept
。
所以,我们实际应用中不再以wx.getSetting(Object object)
的结果作为判断,而是当用户点击某个功能模块,如果该功能模块需要消息推送,那么就直接发起消息订阅。
这样就会造成一个困扰,用户每次进入该功能模块的话,就会每次需要点击“允许”。除非,他勾选“总是保持以上选择,不再询问”。那么就不会再弹窗影响用户体验。
七、参考
觉得好,就一键三连呗(点赞+收藏+关注)