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('用户选择今日不提醒订阅消息')
      }
    },
  })
}```
相关推荐
说私域8 小时前
日本零售精髓赋能下 链动2+1模式驱动新零售本质回归与发展格局研究
人工智能·小程序·数据挖掘·回归·流量运营·零售·私域运营
奔跑的web.8 小时前
UniApp 路由导航守
前端·javascript·uni-app
特立独行的猫a9 小时前
主要跨端开发框架对比:Flutter、RN、KMP、Uniapp、Cordova,谁是未来主流?
flutter·uni-app·uniapp·rn·kmp·kuikly
说私域11 小时前
流量裂变与数字重塑:基于AI智能名片小程序的短视频全域引流范式研究
人工智能·小程序·流量运营·私域运营
万物得其道者成20 小时前
UniApp 多端滑块验证码插件 zxj-slide-verify 实用指南
uni-app
蓝帆傲亦1 天前
支付宝小程序性能暴增秘籍:UniApp项目极限优化全攻略
小程序·uni-app
CHU7290351 天前
淘宝扭蛋机抽盒小程序前端功能解析:解锁趣味抽盒新体验
前端·小程序
2501_933907211 天前
深圳本凡科技专业企业APP开发,助力手机应用创新优化
科技·微信小程序·小程序
每天都要加油呀!1 天前
TypeError: uni.requestPayment is not a function
小程序
java1234_小锋1 天前
分享一套优质的微信小程序校园志愿者系统(SpringBoot后端+Vue3管理端)
微信小程序·小程序·校园志愿者