uniapp小程序 订阅消息推送

uniapp小程序 订阅消息推送 ,单个模板和多个模板以及用户拒绝的再次提醒的处理

(uni.requestSubscribeMessage,uni.getSetting, uni.openSetting)https://uniapp.dcloud.net.cn/api/other/setting.html#opensetting

1. 单个模板处理

js 复制代码
// 订阅赛事通知
function subscribeMessage() {
   //信息模版id
  let pushReservationTmplIds = '87E-QdnkhI5EI0oS'
  uni.getSetting({
    withSubscriptions: true,
    success(res) {
       let {
        authSetting = {},
        subscriptionsSetting: { mainSwitch = false, itemSettings = {} } = {},
      } = res
      console.log(res)
      // 检测不在询问
      if (!mainSwitch) {
        guideOpenSubscribeMessage(pushReservationTmplIds)
      } else {
        uni.requestSubscribeMessage({
          tmplIds: [pushReservationTmplIds],
          success(res) {
            console.log('已成功订阅赛事通知', res)
            if (res[pushReservationTmplIds] === 'accept') {
              uni.showToast({
                title: '赛事通知已推送至微信',
                icon: 'none',
              })
            } else if (res[pushReservationTmplIds] === 'reject') {
              guideOpenSubscribeMessage(pushReservationTmplIds)
            } else {
            }
          },
          fail(res) {
            console.log('订阅失败', res)
          },
        })
      }
    },
  })
}
//检测开启拒绝以及不接收提醒
function guideOpenSubscribeMessage(pushReservationTmplIds) {
  console.log('引导用户开启订阅消息权限')
  // 检查是否已经选择"今日不提醒"
  let todayNoRemind = uni.getStorageSync('today_no') || ''
  let today = new Date().getTime()
  console.log('今日不提醒记录:', todayNoRemind, '今日日期:', today)
  // 如果今天已经选择不提醒,则直接返回
  let boolean = false
  boolean = new Date(todayNoRemind).toDateString() === new Date(today).toDateString()
  if (boolean) {
    return
  }
  console.log(boolean)
  console.log('提示')
  uni.showModal({
    title: '提示',
    content: '为了您能享受更好的赛事体验,建议您授权赛事订阅消息',
    cancelText: '取消提醒',
    confirmText: '前往设置',
    success: (res) => {
      if (res.confirm) {
        uni.openSetting({
          success(settingData) {
            console.log(settingData, 'settingData')
            uni.getSetting({
              withSubscriptions: true,
              success(res) {
                let {
                  authSetting = {},
                  subscriptionsSetting: { mainSwitch = false, itemSettings = {} } = {},
                } = res
                console.log(res)
                if (
                  (authSetting['scope.subscribeMessage'] || mainSwitch) &&
                  itemSettings[pushReservationTmplIds] === 'accept'
                ) {
                  uni.showToast({
                    title: '赛事通知已订阅,下一次报名生效',
                    icon: 'none',
                    duration: 3500,
                  })
                  uni.removeStorageSync('today_no')
                  // console.log('用户手动开启同意了,订阅消息');
                } else {
                }
              },
            })
          },
        })
      } else if (res.cancel) {
        // 用户选择"今日不提醒",记录当前日期
        let today = new Date().getTime()
        uni.setStorageSync('today_no', today)
        uni.showToast({
          title: '今日不再提醒,如需提醒请前往小程序设置开启',
          icon: 'none',
          duration: 3500,
        })
        console.log('用户选择今日不提醒订阅消息')
      }
    },
  })
}

2.多个模板处理

js 复制代码
// 订阅赛事通知
function subscribeMessage() {
  // 修复:将模板ID改为数组,包含三个模板ID
  let pushReservationTmplIds = [
    '0W3viTw4YYp75h20zCv5_',
    'p5dNFUqwSmjHeiZ7VgxCe',
    '87E-QdnkhI5EI0oS-pV7tQc6VjqSw',
  ]

  uni.getSetting({
    withSubscriptions: true,
    success(res) {
      let {
        authSetting = {},
        subscriptionsSetting: { mainSwitch = false, itemSettings = {} } = {},
      } = res
      console.log(res, mainSwitch)
      console.log(itemSettings)
      let itemAccepted = 0
      if (Array.isArray(pushReservationTmplIds)) {
        pushReservationTmplIds.forEach((tmplId) => {
          if (itemSettings[tmplId] === 'accept') {
            itemAccepted++
          }
        })
      }
      // 检测不在询问
      if (!mainSwitch) {
        guideOpenSubscribeMessage(pushReservationTmplIds, itemAccepted)
      } else {
        uni.requestSubscribeMessage({
          tmplIds: pushReservationTmplIds, // 修复:直接使用数组
          success(res) {
            console.log('已成功订阅赛事通知', res)
            // 修复:检查所有模板ID的授权状态
            let acceptedCount = 0
            pushReservationTmplIds.forEach((tmplId) => {
              if (res[tmplId] === 'accept') {
                acceptedCount++
              }
            })

            if (acceptedCount >= pushReservationTmplIds.length) {
              console.log(`成功订阅了${acceptedCount}个模板消息`)
            } else {
              guideOpenSubscribeMessage(pushReservationTmplIds, itemAccepted)
            }
          },
          fail(res) {
            console.log('订阅失败', res)
          },
        })
      }
    },
  })
}
function guideOpenSubscribeMessage(pushReservationTmplIds, itemAccepted) {
  console.log('引导用户开启订阅消息权限')
  // 检查是否已经选择"今日不提醒"
  let todayNoRemind = uni.getStorageSync('today_no') || ''
  let today = new Date().getTime()
  console.log('今日不提醒记录:', todayNoRemind, '今日日期:', today)

  // 如果今天已经选择不提醒,则直接返回
  let boolean = false
  boolean = new Date(todayNoRemind).toDateString() === new Date(today).toDateString()
  if (boolean) {
    return
  }

  console.log('提示')
  uni.showModal({
    title: '提示',
    content: '为了您能享受更好的赛事体验,建议您授权赛事订阅消息',
    cancelText: '取消提醒',
    confirmText: '前往设置',
    success: (res) => {
      if (res.confirm) {
        uni.openSetting({
          success(settingData) {
            console.log(settingData, 'settingData')
            uni.getSetting({
              withSubscriptions: true,
              success(res) {
                let {
                  authSetting = {},
                  subscriptionsSetting: { mainSwitch = false, itemSettings = {} } = {},
                } = res
                console.log(res)
                // 修复:检查是否有任意一个模板被授权
                let hasAccepted = 0
                if (Array.isArray(pushReservationTmplIds)) {
                  pushReservationTmplIds.forEach((tmplId) => {
                    if (itemSettings[tmplId] === 'accept') {
                      hasAccepted++
                    }
                  })
                }

                if (
                  (authSetting['scope.subscribeMessage'] || mainSwitch) &&
                  hasAccepted > itemAccepted
                ) {
                  uni.showToast({
                    title: '赛事通知已订阅,下一次报名生效',
                    icon: 'none',
                    duration: 3500,
                  })
                  uni.setStorageSync('needMessage', true)
                  uni.removeStorageSync('today_no')
                }
              },
            })
          },
        })
      } else if (res.cancel) {
        // 用户选择"今日不提醒",记录当前日期
        let today = new Date().getTime()
        uni.setStorageSync('today_no', today)
        uni.showToast({
          title: '今日不再提醒,如需提醒请前往小程序设置开启',
          icon: 'none',
          duration: 3500,
        })
        console.log('用户选择今日不提醒订阅消息')
      }
    },
  })
}```
相关推荐
说私域17 小时前
社群招募文案的核心构建要点与工具赋能路径——基于AI智能名片链动2+1模式商城小程序的实践研究
人工智能·小程序·私域运营
_ZeroKing19 小时前
自制智能门锁:NFC 刷卡 + 小程序远程开锁(完整实战记录)
嵌入式硬件·小程序·notepad++·arduino
郑州光合科技余经理19 小时前
可独立部署的Java同城O2O系统架构:技术落地
java·开发语言·前端·后端·小程序·系统架构·uni-app
雪芽蓝域zzs20 小时前
uniapp 取消滚动条
uni-app
阿斌_bingyu70921 小时前
眼镜店AR在线试戴小程序技术解决方案
小程序·ar
2401_8658548821 小时前
Uniapp和Flutter哪个更适合企业级开发?
flutter·uni-app
雪芽蓝域zzs21 小时前
uniapp 省市区三级联动
前端·javascript·uni-app
总爱写点小BUG21 小时前
UniApp 图标方案终极排坑:告别 FontClass,拥抱真 SVG 组件化
前端框架·uni-app
计算机毕设指导61 天前
基于微信小程序的智能停车场管理系统【源码文末联系】
java·spring boot·微信小程序·小程序·tomcat·maven·intellij-idea
2501_933907211 天前
如何选择西安优质小程序开发服务与本凡码农合作?
科技·微信小程序·小程序