导航

微信小程序消息订阅

Posted on 2024-12-20 19:53  小白撸代码  阅读(28)  评论(0编辑  收藏  举报

摘要:最近做项目用到微信小程序消息订阅,但是微信官方文档描述的太官方了,好多地方不理解,查阅了好多资料结合官方文档总结一下需要注意的地方

 

使用到的API:

订阅消息API
wx.requestSubscribeMessage(options) 获取设置API wx.getSetting({withSubscriptions:
true })
打开设置API
<button open-type='openSetting'></button>

为啥用到这三个API后边说

 

一、首次订阅的时候,弹出订阅弹,如图:

此时需要注意点:

1、首次授权弹框出现,wx.getSetting 获取到的参数就是一个对象 {mainSwitch: true},里面没有其他参数了

2、只要你点击了《总保持以上选项》,不管消息订阅是否开启【上图的消息开关】,以后订阅弹框都不会再弹出。除非再编辑器上点击《清楚全部缓冲》

3、如果消息订阅不开启开启【上图的消息开关】,此时只能点击《取消》,确定按钮是致灰的

4、当你点击了《总保持以上选项》,同时消息订阅没有开启,但是点击了取消按钮,当你下次再点击订阅的时候,wx.getSetting会发生变化。如下图:会多出itemSettings字段,同时你订阅的消息ID对于的value是‘reject’,表示不接受

  tips:reject 表示不接受,accept 表示同意 具体查看 https://developers.weixin.qq.com/miniprogram/dev/api/open-api/subscribe-message/wx.requestSubscribeDeviceMessage.html#%E5%8F%82%E6%95%B0

5、 当你选中《总保持以上选项》,每次订阅都会弹出订阅授权弹框

二、二次订阅,会根据首次订阅是否选中《总保持以上选项》做判断

1、如果没有选中,则后续每次订阅授权弹框都会弹出

2、如果选中则需要根据wx.getSetting获取结过做判断,并引导用户在设置里面开启,用到了<button open-type='openSetting'></button>

三、其他问题点

1、如果wx.getSetting获取到 mainSwitch=false 则需要引导用户去小程序设置里面打开总订阅开关

2、在设置中总开关打开,但是要订阅的消息选择不接受,则消息无法推送

3、wx.requestSubscribeMessage每调用一次,订阅次数增加1次【重要】
4、当《总保持以上选项》选中,但是消息订阅开关没有打开,需要引导用户去设置中打开消息(允许接受消息)。如果用户选择接受消息,回到页面也需要调用wx.requestSubscribeMessage来增加订阅次数,否则消息还是无法推送【重要】

四、代码展示

export async function subscribeMessage() {
    // 模板ID
    const themeIds = [TARO_APP_SUBSCRIBE_FAULT_MESSAGE_ID, TARO_APP_SUBSCRIBE_COOKING_MESSAGE_ID]
    // 模板映射
    const themeIdToText = {
        [TARO_APP_SUBSCRIBE_FAULT_MESSAGE_ID]: '设备故障',
        [TARO_APP_SUBSCRIBE_COOKING_MESSAGE_ID]: '烹饪完成'
    }

    // 1、获取设置状态
    const settings = (await Taro.getSetting({ withSubscriptions: true })).subscriptionsSetting || {}

    console.log('---设置状态---', settings)

    // 2、总开关
    if (!settings.mainSwitch) {
     // 返回结果,提示用户去设置中开启。可以使用弹框提示, 其中按钮使用<button open=type='openSetting'></button>引导用户
return Promise.resolve({ content: '请在设置中打开消息订阅开关', status: false }) } // 3、单个开关 if (settings.itemSettings) { const notSubscribeTxt = [] const yesSubscribeIds = [] for (const item in settings.itemSettings) { if (settings.itemSettings[item] !== 'accept') { notSubscribeTxt.push(themeIdToText[item]) continue } yesSubscribeIds.push(item) } // 已订阅的消息增加次数 对应上边说的第4点,如果订阅多条,但是只允许接受一条消息,这里应增加允许消息的订阅次数,否则无法推送消息【遇到的坑】 if (notSubscribeTxt.length && yesSubscribeIds.length) { Taro.requestSubscribeMessage({ tmplIds: yesSubscribeIds }) } // 提示未订阅消息去订阅 if (notSubscribeTxt.length) { return Promise.resolve({ content: `请在设置中打开${notSubscribeTxt.join('')}消息通知开关`, status: false }) } } // 4、请求订阅 return new Promise((resolve, reject) => { Taro.requestSubscribeMessage({ tmplIds: themeIds, success: function (res) { resolve({ content: '订阅成功', status: true }) }, fail: function (err) { resolve({ content: '订阅失败', status: true }) } }) }) }