/**
* @desc 小程序订阅功能
* @param {Array} tmplIds 订阅列表
* @returns {Promise} 返回promise
*/
// 永久关闭订阅则代表点击了我不在接受此消息,再次订阅是无法弹起授权窗口的。普通关闭时可以再次弹起授权窗口。
export const Subscribe = (tmplIds = []) => {
return new Promise((resolve, reject) => {
// 判断是否为微信小程序,不是的不做订阅进行跳过
let isWx = false;
// #ifdef MP-WEIXIN
isWx = true;
// #endif
if (!isWx) resolve(1);
console.log('进来了哟')
// 判断基本库是否在2.8.3,低于的暂时不做订阅进行跳过
const versionCan = compareVersion("2.8.3");
if (versionCan === -1) resolve(1);
// 主流程
requestSubscribe(tmplIds, resolve, reject)
})
}
// 申请订阅功能
function requestSubscribe(tmplIds, resolve, reject) {
uni.requestSubscribeMessage({
tmplIds,
success: async res => {
// 检查订阅数量
let checkSubscribeBool = await checkSubscribeAll(tmplIds, res);
if (checkSubscribeBool) {
// 用户完成订阅
console.log("[用户完成订阅]")
resolve(1);
} else {
// 跳去检查永久关闭订阅还是普通关闭订阅
guidSubscribeMessageAuthAfter(tmplIds, resolve, reject);
}
},
fail: res => {
console.log(res, "订阅,失败");
if (res.errCode == 20004) {
// console.log(res, 'fail:用户关闭了主开关,无法进行订阅,引导开启---');
guideOpenSubscribeMessage(tmplIds, resolve, reject);
}
return
}
})
}
// 计算用户订阅消息的数量
function checkSubscribeAll(tmplIds, res) {
// 将accept的生成一个数组,判断申请的订阅消息是不是已经订阅消息的子集
let arr = [];
for (const key of Object.keys(res)) {
if (res[key] === 'accept') {
arr.push(key);
}
}
if (arr.length == tmplIds.length) {
console.log('订阅完毕')
return true
} else {
console.log('没订阅或者少订阅')
return false
}
}
// 检查用户是否授权完毕(检查时永久关闭还是普通关闭)
function guidSubscribeMessageAuthAfter(tmplIds, resolve, reject) {
uni.getSetting({
withSubscriptions: true,
success: async res => {
let {
authSetting = {},
subscriptionsSetting: { mainSwitch = false, itemSettings = {} } = {}
} = res;
if (Object.keys(itemSettings).length == 0) { // 这种情况是普通关闭
uni.showModal({
title: "温馨提示",
content: "同意订阅才能及时获知完成进度领取优惠",
confirmText: "重新订阅",
cancelText: "我再看看",
success: res => {
if (res.confirm) {
// 重新调起授权订阅
requestSubscribe(tmplIds, resolve, reject);
} else if (res.cancel) {
//没成功订阅,返回reject
reject(2);
}
}
});
} else { // 这种是订阅成功或永久关闭
let checkSubscribeBool = await checkSubscribeAll(tmplIds, itemSettings);
if (
authSetting["scope.subscribeMessage"] ||
(mainSwitch && checkSubscribeBool)
) {
//成功
console.log("用户手动开启同意了,订阅消息");
resolve(1);
} else {
//失败,永久关闭
guideOpenSubscribeMessage(tmplIds, resolve, reject);
}
}
}
});
}
//引导用户重新授权(永久关闭的方法)
function guideOpenSubscribeMessage(tmplIds, resolve, reject) {
// console.log(resolve, reject, 'rescovavasr1')
uni.showModal({
title: "温馨提示",
content: "检测到您没有开启全部订阅消息的权限,是否去设置?",
success: res => {
if (res.confirm) {
uni.openSetting({
success: res => {
// 在检查是否全部订阅完毕
guidSubscribeMessageAuthAfter(tmplIds, resolve, reject);
}
});
} else if (res.cancel) {
// console.log(resolve, reject, 'rescovavasr2')
uni.showModal({
title: "温馨提示",
content: "同意订阅才能及时获知完成进度领取优惠",
showCancel: false,
confirmText: "我知道了"
});
reject(2);
}
}
});
}
// 比较版本号
function compareVersion(v2) {
let { SDKVersion: v1 } = uni.getSystemInfoSync();
v1 = v1.split(".");
v2 = v2.split(".");
const len = Math.max(v1.length, v2.length);
while (v1.length < len) {
v1.push("0");
}
while (v2.length < len) {
v2.push("0");
}
for (let i = 0; i < len; i++) {
const num1 = parseInt(v1[i]);
const num2 = parseInt(v2[i]);
if (num1 > num2) {
return 1;
} else if (num1 < num2) {
return -1;
}
}
return 0;
}