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('用户选择今日不提醒订阅消息')
      }
    },
  })
}```
相关推荐
微三云 - 廖会灵 (私域系统开发)16 小时前
消费返物业费平台搭建:美家时代商业模式拆解与系统开发选型指南
小程序·系统架构
greenbbLV19 小时前
中小公司积分商城选型:SaaS与私有化方案对比解析
大数据·前端·小程序
结网的兔子2 天前
【前端开发】Web端迁移至 uni-app 及鸿蒙扩展方案对比
前端·uni-app·harmonyos
2501_915909062 天前
iOS 应用反调试技详解术 检测调试器的原理与防护实践
android·ios·小程序·https·uni-app·iphone·webview
AI多Agent协作实战派2 天前
AI多Agent协作系统实战(二十八):顶栏统一战争——从1个页面异常到31个页面全量对齐
数据库·人工智能·uni-app
00后程序员张2 天前
iOS加固技术路线全面解析:Bitcode模式、源码模式与汇编模式对比及爱加密优势
android·汇编·ios·小程序·uni-app·cocoa·iphone
海纳百川·纳海川2 天前
租房行业数字化:换个思路解决“老问题”
大数据·微信小程序·小程序
上海云盾-小余3 天前
CC 高频请求 + DDoS 流量攻击实战防御:全链路 WAF 流量清洗部署完整流程
网络·爬虫·安全·小程序·ddos
2501_916008893 天前
iOS IPA文件反编译与打包操作方法,拆包分析防护和加固打包
android·macos·ios·小程序·uni-app·cocoa·iphone
2301_810313183 天前
海外教育APP定制发展现状与开发选型核心要点解析
小程序·团队开发·软件需求