微信小程序的消息订阅功能允许开发者在用户同意的情况下,向用户发送通知消息。这个功能对于提升用户体验和服务闭环非常重要。
对于普通开发者来说,通常只能使用一次性订阅功能。
通过合理设计,一次性订阅也能实现类似长期订阅的效果:
核心问题:如何知道用户是否在订阅时勾选了"总是保持以上选择,不再询问"?
无论用户是否勾选"总是保持以上选择,不再询问",调用requestSubscribeMessage函数都会返回相同的结果:
// 订阅请求返回结果(两种情况下相同)
{
"ACS7cwcbx0F0Y_YaB4GZr7rWP7BO2-7wQOtYsnUjmFI": "accept",
"errMsg": "requestSubscribeMessage:ok"
}
通过wx.getSetting(配合withSubscriptions: true参数)可以观察到关键差异:
wx.getSetting({
withSubscriptions: true,
success(res) {
console.log("获取成功:", res.authSetting);
console.log("完整订阅消息设置:", JSON.stringify(res.subscriptionsSetting, null, 2));
}
});
// 返回结果:
{
"mainSwitch": true,
"itemSettings": {
"ACS7cwcbx0F0Y_YaB4GZr7rWP7BO2-7wQOtYsnUjmFI": "accept"
},
"ACS7cwcbx0F0Y_YaB4GZr7rWP7BO2-7wQOtYsnUjmFI": "accept"
}
// 返回结果:
{
"mainSwitch": true
}
判断用户是否勾选"总是保持以上选择"的核心方法是:检查wx.getSetting返回结果中是否存在subscriptionsSetting.itemSettings对象及其内容。
| 特征 | 勾选了"不再询问" | 未勾选"不再询问" |
|---|---|---|
mainSwitch |
true | true |
itemSettings |
存在且包含模板ID | 不存在 |
| 模板ID属性 | 存在(如ACS7cw...: "accept") |
不存在 |
/**
* 判断用户是否永久订阅某个模板
* @param {string} templateId - 消息模板ID
* @returns {boolean} - 是否永久订阅
*/
function checkPermanentSubscription(templateId) {
return new Promise((resolve) => {
wx.getSetting({
withSubscriptions: true,
success(res) {
const { subscriptionsSetting = {} } = res;
// 关键判断逻辑
if (subscriptionsSetting.itemSettings &&
subscriptionsSetting.itemSettings[templateId] === 'accept') {
// 用户勾选了"不再询问"且接受了该模板
resolve(true);
} else {
// 用户未勾选"不再询问"或未接受该模板
resolve(false);
}
},
fail() {
resolve(false);
}
});
});
}
async function smartSubscribe(templateIds) {
const setting = await getSubscriptionSettings();
// 过滤出需要请求订阅的模板
const needSubscribeIds = templateIds.filter(id => {
return !(setting.itemSettings && setting.itemSettings[id] === 'accept');
});
if (needSubscribeIds.length === 0) {
console.log('所有模板已永久订阅');
return Promise.resolve();
}
// 只请求未永久订阅的模板
return wx.requestSubscribeMessage({
tmplIds: needSubscribeIds
});
}
建议在设置页面提供清晰的订阅状态展示,让用户了解当前的订阅情况,并可以方便地管理自己的订阅偏好。
通过分析wx.getSetting返回的subscriptionsSetting对象结构,我们可以准确判断用户是否勾选了"总是保持以上选择,不再询问":
itemSettings对象且包含对应的模板ID → 用户勾选了"不再询问"mainSwitch: true → 用户未勾选"不再询问"这种判断机制为开发者提供了更精细的订阅管理能力,能够根据用户的不同选择优化订阅流程,提升用户体验,同时避免不必要的订阅弹窗干扰。