在微信小程序开发中,订阅消息是一种重要的用户触达方式。然而,开发者经常面临一个问题:如何准确地检测用户是否订阅了特定的模板消息?当用户在设置中手动关闭订阅权限时,如何在前端及时反映这一状态变化?
传统的做法是依赖本地存储来记录用户订阅状态,但这存在明显的缺陷:当用户在微信设置中手动关闭订阅权限时,应用无法感知这一变化,导致界面上显示的状态与实际状态不一致。
微信小程序提供了检查订阅消息状态的官方API,关键在于使用 withSubscriptions: true 参数:
uni.getSetting({
withSubscriptions: true, // 关键参数
success(res) {
console.log(res.subscriptionsSetting);
// 包含 mainSwitch 和 itemSettings 字段
}
});
返回的 subscriptionsSetting 对象包含以下重要字段:
withSubscriptions: true 参数调用 getSettingconst checkSubscriptionStatus = () => {
if (typeof uni.getSetting === 'function') {
uni.getSetting({
withSubscriptions: true,
success: (res) => {
if (res.subscriptionsSetting) {
// 检查主开关
const mainSwitch = res.subscriptionsSetting.mainSwitch;
// 检查特定模板状态
const itemSettings = res.subscriptionsSetting.itemSettings || {};
const templateStatus = itemSettings[TEMPLATE_ID];
// 根据状态更新本地存储和UI
if (mainSwitch === false || templateStatus === 'reject' || templateStatus === 'ban') {
// 更新为未订阅状态
notificationsEnabled.value = false;
uni.setStorageSync('notificationsEnabled', false);
} else if (mainSwitch === true && templateStatus === 'accept') {
// 更新为已订阅状态
notificationsEnabled.value = true;
uni.setStorageSync('notificationsEnabled', true);
}
}
},
fail: (err) => {
console.error('Failed to get user settings:', err);
}
});
}
};
withSubscriptions 参数通过使用 uni.getSetting 配合 withSubscriptions: true 参数,我们可以准确地检测用户对订阅消息的设置,实现前端独立的状态管理,无需依赖后端服务。这种方法能够实时反映用户在微信设置中的操作,提升用户体验和应用的准确性。