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('用户选择今日不提醒订阅消息')
      }
    },
  })
}```
相关推荐
paopaokaka_luck6 小时前
停车小程序(车牌OCR智能识别、地图API、Echarts图形化分析、智能车位预约、自动计费与订单处理)
小程序·ocr·echarts
FinelyYang7 小时前
UniApp + LiveKit:Android 端为什么要用原生做屏幕共享,以及我们怎么落地的
android·uni-app
单词记忆方法研究8 小时前
大学英语单词:我踩过的坑,和你该走的路
机器学习·小程序·学习方法
Ai-_Man11 小时前
怎么手动备份豆包智能体的聊天数据?
人工智能·ai·小程序
宠友信息14 小时前
IM系统开发技术路线分析,即时通讯源码助力快速搭建聊天应用
java·spring boot·redis·websocket·mysql·uni-app·vue
Ai-_Man14 小时前
豆包收藏夹能批量导出吗?从底层逻辑拆解「AI导出鸭」如何解构这一技术难题
人工智能·ai·小程序
微擎应用18 小时前
小程序抽奖工具
小程序
Ai-_Man1 天前
希望大家能推荐一款软件,可以直接把文心生成的代码变流程图,提高办公效率
人工智能·ai·小程序·流程图
Chengbei111 天前
DSH渗透测试插件dsh-pentest全新升级!适配DeepSeek Harness,可视化探索链路,一键搭建轻量化AI渗透测试环境。
人工智能·web安全·网络安全·微信·小程序·系统安全·安全架构
2601_949950631 天前
用练题簿小程序把课件做成可以在线刷题的内容
小程序·练习·小程序推荐