订阅消息
一、小程序订阅消息逻辑处理
可以将其挂在APP上,使用起来会更加便捷
subscribeMessage: (val, callback) => {
//需要订阅的消息模板,在微信公众平台手动配置获取模板ID
let message = val; // 模板id
//如果总是拒绝(subscriptionsSetting,2.10.1库才支持)
// wx.setStorageSync("subType",1)
if (versionCompare('2.10.1')) {
wx.getSetting({
withSubscriptions: true,//是否同时获取用户订阅消息的订阅状态,默认不获取
success: (res) => {
console.info("res",res)
if (res.subscriptionsSetting && res.subscriptionsSetting.itemSettings &&
res.subscriptionsSetting.itemSettings[message] == "reject") {
//打开设置去设置
openConfirm('检测到您没打开推送权限,是否去设置打开?');
} else if (res.subscriptionsSetting && res.subscriptionsSetting.itemSettings &&
res.subscriptionsSetting.itemSettings[message] == "accept") { // 已有授权过
console.log('已有订阅授权过')
wx.requestSubscribeMessage({
tmplIds: message,
success: (res) => {
if (res[message] == 'accept') {
console.log("resrequestSubscribeMessage",res)
//用户允许
}
callback()
},
fail: (res) => { console.log("res",res)
callback()
},
})
} else {
wx.requestSubscribeMessage({
tmplIds: message,
success: (res) => {
if (res[message] == 'accept') {
console.log("resrequestSubscribeMessage",res)
//用户允许
}
callback()
},
fail: (res) => { console.log("res",res)
callback()
},
})
}
}
})
} else if (versionCompare('2.4.4')) {
wx.requestSubscribeMessage({
tmplIds: message,
success: (res) => {
if (res[message] == 'accept') {
//用户允许
}
callback()
},
fail: (res) => { console.info(res)
callback()
},
})
}
//打开设置
function openConfirm(message) {
wx.showModal({
content: message,
confirmText: "确认",
cancelText: "取消",
success: (res) => {
//点击“确认”时打开设置页面
if (res.confirm) {
wx.openSetting({
success: (res) => {
console.log(res.authSetting)
},
fail: (error) => {
console.log(error)
}
})
} else {
console.log('用户点击取消')
}
}
});
}
//基础库版本比较
function versionCompare(v) {
const version = wx.getSystemInfoSync().SDKVersion
if (compareVersion(version, v) >= 0) {
return true
} else {
return false
}
}
function compareVersion(v1, v2) {
v1 = v1.split('.')
v2 = v2.split('.')
var len = Math.max(v1.length, v2.length)
while (v1.length < len) {
v1.push('0')
}
while (v2.length < len) {
v2.push('0')
}
for (var i = 0; i < len; i++) {
var num1 = parseInt(v1[i])
var num2 = parseInt(v2[i])
if (num1 > num2) {
return 1
} else if (num1 < num2) {
return -1
}
}
return 0
}
},
二、使用步骤
app.subscribeMessage(['这里放模板ID'],()=>{
// 订阅后的回调方法
});
三、不订阅也能收到一次性模板消息?
用户点击一次就相当于订阅了一次,相当于你拥有了一次获取系统通知的门票,理论上用户多次点击就相当于订阅了多次,此时是会将这些订阅次数储存起来,如果服务器下发通知时就会消耗一次订阅次数(实际是这样的,文档没有说,需要确保每次下发前触发一次订阅交互);产品是可以接受的。不是bug.