You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
6.6 KiB
229 lines
6.6 KiB
/**
|
|
* 检查新版本更新
|
|
*/
|
|
export function checkForUpdate() {
|
|
const updateManager = uni.getUpdateManager();
|
|
// 监听向微信后台请求检查更新结果事件。微信在小程序冷启动时自动检查更新,不需由开发者主动触发。
|
|
updateManager.onCheckForUpdate(function (res) {
|
|
//是否有新版本
|
|
console.log(res.hasUpdate ? "有小程序新版本" : "无小程序新版本");
|
|
});
|
|
//监听小程序有版本更新事件。客户端主动触发下载(无需开发者触发),下载成功后回调
|
|
updateManager.onUpdateReady(function () {
|
|
uni.showModal({
|
|
title: "更新提示",
|
|
content: "新版本已经准备好,是否重启应用?",
|
|
success(res) {
|
|
if (res.confirm) {
|
|
// 强制小程序重启并使用新版本。在小程序新版本下载完成后(即收到 onUpdateReady 回调)调用
|
|
updateManager.applyUpdate();
|
|
}
|
|
},
|
|
});
|
|
});
|
|
// 监听小程序更新失败事件。小程序有新版本,客户端主动触发下载(无需开发者触发),下载失败(可能是网络原因等)后回调
|
|
updateManager.onUpdateFailed(function () {
|
|
uni.showToast({
|
|
title: "小程序更新失败,请刷新后重试",
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 导航栏高度(针对小程序)
|
|
* @returns {String}
|
|
*/
|
|
export function navigationBarHeight() {
|
|
const { bottom } = uni.getMenuButtonBoundingClientRect();
|
|
return `${bottom + 8}px`;
|
|
}
|
|
|
|
/**
|
|
* 解析url查询参数
|
|
* @param {String} url
|
|
* @returns {Object}
|
|
*/
|
|
export function parseURLSearchParams(url = "") {
|
|
const queryParams = {};
|
|
if (url.includes("?")) {
|
|
const keyValueArr = url.split("?")[1].split("&");
|
|
keyValueArr.forEach((item) => {
|
|
const [key, value] = item.split("=").map(decodeURIComponent);
|
|
if (queryParams.hasOwnProperty(key)) {
|
|
if (Array.isArray(queryParams[key])) {
|
|
queryParams[key].push(value);
|
|
} else {
|
|
queryParams[key] = [queryParams[key], value];
|
|
}
|
|
} else {
|
|
queryParams[key] = value;
|
|
}
|
|
});
|
|
}
|
|
return queryParams;
|
|
}
|
|
|
|
/**
|
|
* 授权申请
|
|
* 注意: 需要授权 scope.userLocation、scope.userLocationBackground、scope.userFuzzyLocation 时必须在 permission 中配置地理位置用途说明
|
|
* @param {String} scope
|
|
* @returns {Promise}
|
|
* @see https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/authorize.html
|
|
*/
|
|
export function applyAuthorize(scope) {
|
|
const scopeMap = {
|
|
"scope.userLocation": "精确地理位置",
|
|
"scope.userFuzzyLocation": "模糊地理位置",
|
|
"scope.userLocationBackground": "后台定位",
|
|
"scope.record": "麦克风",
|
|
"scope.camera": "摄像头",
|
|
"scope.bluetooth": "蓝牙",
|
|
"scope.writePhotosAlbum": "添加到相册",
|
|
"scope.addPhoneContact": "添加到通讯录",
|
|
"scope.addPhoneCalendar": "添加到日历",
|
|
"scope.werun": "微信运动步数",
|
|
// "scope.address": "通讯地址",
|
|
// "scope.invoiceTitle": "发票抬头",
|
|
// "scope.invoice": "获取发票",
|
|
// "scope.userInfo": "用户信息",
|
|
};
|
|
if (Object.keys(scopeMap).includes(scope) === false) {
|
|
throw new Error("scope 参数非法");
|
|
}
|
|
|
|
return new Promise((resolve, reject) => {
|
|
// 获取用户授权设置
|
|
uni.getSetting({
|
|
success: (res) => {
|
|
// console.log("授权状态", res);
|
|
if (res.authSetting[scope] !== true) {
|
|
// 发起授权请求
|
|
uni.authorize({
|
|
scope: scope,
|
|
success: () => {
|
|
resolve("用户同意授权");
|
|
},
|
|
fail: () => {
|
|
reject("用户拒绝授权");
|
|
uni.showModal({
|
|
title: "权限申请",
|
|
content: `请在设置界面中开启[${scopeMap[scope]}]权限,否则可能无法正常提供服务`,
|
|
success: function (res) {
|
|
if (res.confirm) {
|
|
// 打开设置界面(用户发生点击行为后,才可以跳转打开设置页)
|
|
uni.openSetting({
|
|
withSubscriptions: true,
|
|
});
|
|
}
|
|
},
|
|
});
|
|
},
|
|
});
|
|
} else {
|
|
// 已同意授权的
|
|
resolve("用户已授权");
|
|
}
|
|
},
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 消息订阅
|
|
* @param {Array} tmplIds
|
|
* @returns {Promise}
|
|
*/
|
|
export function subscribeMessage(tmplIds = []) {
|
|
return new Promise((resolve, reject) => {
|
|
uni.requestSubscribeMessage({
|
|
tmplIds: tmplIds,
|
|
success: (res) => {
|
|
const acceptTmplIds = tmplIds.filter((tmplId) => {
|
|
return res[tmplId] === "accept";
|
|
});
|
|
resolve(acceptTmplIds);
|
|
},
|
|
fail: (err) => {
|
|
if (err.errCode === 20004) {
|
|
uni.showModal({
|
|
title: "通知管理设置",
|
|
content: '请在"通知管理"中打开"接收通知",否则可能无法正常提供服务',
|
|
success: function (res) {
|
|
if (res.confirm) {
|
|
uni.openSetting({
|
|
withSubscriptions: true,
|
|
});
|
|
}
|
|
},
|
|
});
|
|
}
|
|
reject(err);
|
|
},
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 对象属性按字典排序
|
|
* @param {Object} obj
|
|
* @returns {Object}
|
|
*/
|
|
export function ksort(obj = {}) {
|
|
const keys = Object.keys(obj).sort();
|
|
const newObj = {};
|
|
keys.forEach((key) => {
|
|
newObj[key] = obj[key];
|
|
});
|
|
return newObj;
|
|
}
|
|
|
|
/**
|
|
* 查询节点信息
|
|
* 注意:使用 uni.createSelectorQuery() 需要在生命周期 mounted 后进行调用
|
|
* @param {String} selector
|
|
* @param {Boolean} all
|
|
* @returns {Promise}
|
|
* @see https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.boundingClientRect.html
|
|
*/
|
|
export function getRect(selector, all = false) {
|
|
return new Promise((resolve) => {
|
|
uni
|
|
.createSelectorQuery()
|
|
[all ? "selectAll" : "select"](selector)
|
|
.boundingClientRect((rect) => {
|
|
if (all && Array.isArray(rect) && rect.length) {
|
|
resolve(rect);
|
|
}
|
|
if (!all && rect) {
|
|
resolve(rect);
|
|
}
|
|
})
|
|
.exec();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 比较版本号
|
|
* @param {String} v1
|
|
* @param {String} v2
|
|
* @returns {Number} 1大于 0等于 -1小于
|
|
* @see https://developers.weixin.qq.com/miniprogram/dev/framework/compatibility.html
|
|
*/
|
|
export function compareVersion(v1, v2) {
|
|
const parts1 = v1.split(".").map(Number);
|
|
const parts2 = v2.split(".").map(Number);
|
|
|
|
const len = Math.max(parts1.length, parts2.length);
|
|
|
|
for (let i = 0; i < len; i++) {
|
|
const num1 = parts1[i] || 0;
|
|
const num2 = parts2[i] || 0;
|
|
|
|
if (num1 !== num2) {
|
|
return num1 > num2 ? 1 : -1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|