微信小程序一次性订阅封装
封装代码如下:
export async function subscribeMessage(tmplIds: string[]): Promise<ISubscribeMessagePromise> {// 模板ID// 1、获取设置状态const settings = (await wx.getSetting({ withSubscriptions: true })).subscriptionsSetting || {}console.log('---设置状态---', settings)// 2、总开关if (!settings.mainSwitch) {return Promise.resolve({ content: '请在设置中打开消息订阅开关', status: false })}// 3、单个开关if (settings.itemSettings) {const notSubscribeTxt: string[] = []const yesSubscribeIds: string[] = []for (const item in settings.itemSettings) {if (settings.itemSettings[item] !== 'accept') {notSubscribeTxt.push(SUBSCRIBE_NOTICE[item])continue}yesSubscribeIds.push(item)}// 已订阅的消息增加次数 对应上边说的第4点,如果订阅多条,但是只允许接受一条消息,这里应增加允许消息的订阅次数,否则无法推送消息【遇到的坑】if (notSubscribeTxt.length && yesSubscribeIds.length) {wx.requestSubscribeMessage({ tmplIds: yesSubscribeIds, entityIds: [] })}if (notSubscribeTxt.length) {return Promise.resolve({ content: `请在设置中打开${notSubscribeTxt.join('、')}消息通知开关`, status: false })}}// 4、请求订阅return new Promise((resolve, reject) => {wx.requestSubscribeMessage({tmplIds: tmplIds,entityIds: [],success: function (res) {resolve({ content: '', status: true })},fail: function (err) {resolve({ content: '', status: true })}})})
}
调用
三、其他问题点
1、如果wx.getSetting获取到 mainSwitch=false 则需要引导用户去小程序设置里面打开总订阅开关
2、在设置中总开关打开,但是要订阅的消息选择不接受,则消息无法推送
3、wx.requestSubscribeMessage每调用一次,订阅次数增加1次【重要】
4、当《总保持以上选项》选中,但是消息订阅开关没有打开,需要引导用户去设置中打开消息(允许接受消息)。如果用户选择接受消息,回到页面也需要调用wx.requestSubscribeMessage来增加订阅次数,否则消息还是无法推送【重要】