前言:
每次做订阅消息都是网上粘贴复制,有的时候生效,有的时候不生效,还有可能无法唤起,遇到好多奇奇怪怪得现象,所以花了点时间整理一下,仅供参考。
特征/流程:
【方法】
wx.getSetting,
withSubscriptions: true,
res.subscriptionsSetting.mainSwitch,
res.subscriptionsSetting.itemSettings,
wx.showModal,
wx.openSetting,
wx.requestSubscribeMessage
【目的】
获取授权状态
【流程】
状态1 总开关开启-已授权模板消息-所有模板消息均已授权(上述方法1条就通过,所以遍历模板id判断)
状态2 总开关开启-已授权模板消息-存在未授权模板消息(上述方法1条就通过,所以遍历模板id判断)
状态3 总开关开启-未授权模板消息
状态4 总开关关闭
状态1_1 -> 下一步(例如提交订单)
状态2_1 -> 提示二次确认弹窗(检测到有订阅消息未开启,是否前往设置?)
状态3_1 -> 唤起授权弹窗(wx.requestSubscribeMessage)
状态4_1 -> 提示二次确认弹窗(检测到您未开启订阅消息,是否前往设置?)
状态2_1_1 -> 取消前往 -> 下一步(例如提交订单)
状态2_1_2 -> 确定 -> 跳转到设置页面(openSetting)
状态3_1_1 -> 不勾选模板,不勾选总是保持以上选择,只能取消
状态3_1_2 -> 不勾选模板,勾选总是保持以上选择,只能取消
状态3_1_3 -> 勾选模板某一条模板,不勾选总是保持以上选择,取消
状态3_1_4 -> 勾选模板某一条模板,不勾选总是保持以上选择,允许
状态3_1_5 -> 勾选模板某一条模板,勾选总是保持以上选择,取消
状态3_1_6 -> 勾选模板某一条模板,勾选总是保持以上选择,允许
状态3_1_7 -> 勾选全部模板,不勾选总是保持以上选择,取消
状态3_1_8 -> 勾选全部模板,不勾选总是保持以上选择,允许
状态3_1_9 -> 勾选全部模板,勾选总是保持以上选择,取消
状态3_1_10 -> 勾选全部模板,勾选总是保持以上选择,允许
状态4_1_1 -> 取消前往 -> 下一步(例如提交订单)
状态4_1_2 -> 确定 -> 跳转到设置页面(openSetting)
状态2_1_2_1 -> 不勾选/取消勾选->返回后-> 下一步(例如提交订单)
状态2_1_2_2 -> 勾选 ->返回后-> 下一步(例如提交订单)
状态3_1_1_1 -> 取消后设置里不会出现模板 -> 下一步(例如提交订单)
状态3_1_2_1 -> 取消后设置里会出现模板,都是不接收状态 -> 下一步(例如提交订单)
状态3_1_3_1 -> 取消后设置里不会出现模板 -> 下一步(例如提交订单)
状态3_1_4_1 -> 允许后设置里不会出现模板(此时的允许是否生效还有待商榷) -> 下一步(例如提交订单)
状态3_1_5_1 -> 取消后设置里会出现模板,都是不接收状态 -> 下一步(例如提交订单)
状态3_1_6_1 -> 允许后 设置里会出现模板,勾选的是接收状态,未勾选的是不接收状态 -> 下一步(例如提交订单)
状态3_1_7_1 -> 取消后设置里不会出现模板 -> 下一步(例如提交订单)
状态3_1_8_1 -> 允许后设置里不会出现模板 -> 下一步(例如提交订单)
状态3_1_9_1 -> 取消后设置里会出现模板,都是不接收状态 -> 下一步(例如提交订单)
状态3_1_10_1 -> 允许后设置里会出现模板,都是接收状态 -> 下一步(例如提交订单)
状态4_1_2_1 -> 开启接收订阅消息总开关
状态4_1_2_2 -> 不开启接收订阅消息总开关
状态4_1_2_1_1 -> 返回后->提示二次确认弹窗(检测到有订阅消息未开启,是否前往设置?)
状态4_1_2_2_1 -> 返回后-> 下一步(例如提交订单)
状态4_1_2_1_1_1 -> 取消 -> 下一步(例如提交订单)
状态4_1_2_1_1_2 -> 确定 -> 状态3_1
总结
授权弹窗不勾选总是保持以上选择按钮,无论选择还是不选择模板,取消或允许,设置里都不会出现模板(选择了模板并且允许是否成功?未知)
授权弹窗勾选总是保持以上选择按,取消后,无论选择全部模板,还是某一个,设置里都会出现模板并且为未接收
授权弹窗勾选总是保持以上选择按,允许后,设置里都会出现模板,状态为勾选状态
在经过了无数次操作后,设置失败和授权失败再次确认后, 基本上形成了闭合。
注意
如果是设置总开关后,返回检测模板未授权无法直接唤起授权弹窗,需要借助二次确认弹窗,确定后才能唤起。
流程截图
总开关
模板未开启/未勾选总保持按钮取消
模板全部开启/勾选总保持并允许
模板部分开启/勾选总保持允许
授权弹窗
完整代码
方法分开写的,为了便于理解,缺点是存在重复性代码,请自行封装和合并
第一步 thia.dingyue();
that.onSubmit(); 是下一步提交方法
// 验证订阅状态
dingyue(type){
let that = this;
wx.getSetting({
withSubscriptions: true,
success: function(res) {
if (res.subscriptionsSetting.mainSwitch) {
// 用户已开启总开关
let itemSettings = res.subscriptionsSetting.itemSettings;
if (itemSettings) {
// 用户已授权模板消息
let status = true;
//判断模板是否全部授权
for(let i=0; i<tmplIds.length; i++){
let key = tmplIds[i];
if(itemSettings[key] != 'accept'){
status = false;
break;
}
}
if(!status){
that.weidingyue_muban();
}else{
that.onSubmit();
}
} else {
// 用户未授权任何模板消息
if(type == 'kaiguan'){ // 设置返回后提示是否授权模板
that.onSettingNotSubscribeMessage();
return;
}
that.openSubscribeMessage();
}
} else {
// 用户未开启总开关
if(type == 'kaiguan'){ // 设置返回后仍未开启进入下一步
that.onSubmit();
return;
}
that.weidingyue_kaiguan();
}
}
});
},
// 未开启订阅 开关
weidingyue_kaiguan(){
let that = this;
wx.showModal({
title: '提示',
content: '检测到您未开启订阅消息,是否前往设置?',
success (res) {
if (res.confirm) {
that.openSetting('kaiguan');
} else if (res.cancel) {
that.onSubmit();
}
}
})
},
// 未开启订阅 模板
weidingyue_muban(){
let that = this;
wx.showModal({
title: '提示',
content: '检测到有订阅消息未开启,是否前往设置?',
success (res) {
if (res.confirm) {
that.openSetting('muban');
} else if (res.cancel) {
that.onSubmit();
}
}
})
},
// 打开设置
openSetting(type){
let that = this;
wx.openSetting({
success: function(res) {
// 返回后流程
if(type == 'muban'){
that.onSubmit();
} else if(type == 'kaiguan'){
// 再次验证订阅状态
that.dingyue('kaiguan');
}
},
fail: function(err) {
that.settingFail(type);
}
});
},
// 设置失败
settingFail(type){
let that = this;
wx.showModal({
title: '提示',
content: '设置失败,是否重新设置?',
success (res) {
if (res.confirm) {
that.openSetting(type);
} else if (res.cancel) {
that.onSubmit();
}
}
})
},
// 设置开启总开关返回后,并未授权的情况(如果不加二次确认弹窗,无法直接唤起授权弹窗)
onSettingNotSubscribeMessage(){
let that = this;
wx.showModal({
title: '提示',
content:'检测到有订阅消息未授权,是否授权?',
success (res) {
if (res.confirm) {
that.openSubscribeMessage();
} else if (res.cancel) {
that.onSubmit();
}
}
})
},
// 唤起授权订阅弹窗
openSubscribeMessage(){
let that = this;
wx.requestSubscribeMessage({
tmplIds,
success(res) {
that.onSubmit();
},
fail(err) {
that.subscribeMessageFail();
}
})
},
// 授权失败
subscribeMessageFail(){
let that = this;
wx.showModal({
title: '提示',
content:'授权失败,是否重新授权?',
success (res) {
if (res.confirm) {
that.openSubscribeMessage();
} else if (res.cancel) {
that.onSubmit();
}
}
})
},