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('用户选择今日不提醒订阅消息')
      }
    },
  })
}```
相关推荐
镭封6 小时前
自媒体内容生产怎么提速?文案整理、配音与剪辑流程
人工智能·小程序·音视频·语音识别·媒体
anyup6 小时前
uView Pro X 1.0.0 发布:全面支持 uni-app x 蒸汽模式,80+ 组件
前端·uni-app·ai编程
科威网络7 小时前
小程序开发性能优化:分包、预加载与启动时间
性能优化·微信小程序·小程序
zhongben123_10 小时前
从零开发一个打车APP:技术选型、系统架构与成本评估指南
大数据·运维·ios·系统架构·uni-app·web app
派小心.13 小时前
App数据统计平台怎么选?从SDK接入到日活留存看板的技术实现
数据库·人工智能·小程序
互联网+人工智能观察14 小时前
微信小程序私有化定制、源码交付方案选型|SaaS / 模板二开 / 定制方案技术对比
微信小程序·小程序
微三云 - 廖会灵 (私域系统开发)14 小时前
小程序首屏从 3.2s 压到 1.1s:我们在这个订货商城项目上做的 7 个改动与 3 个踩坑
小程序
微擎应用市场15 小时前
二手闲置交易小程序管理系统
小程序
小小王app小程序开发15 小时前
潮玩抽赏小程序玩法开发分析
小程序
干啥啥不行,bug第一名15 小时前
小程序里不要用 requestAnimationFrame
小程序