zhxy-jsd/src/utils/uniapp.ts

437 lines
13 KiB
TypeScript
Raw Normal View History

2025-04-22 10:22:33 +08:00
import pages from '@/pages.json'
import {ComponentInternalInstance} from 'vue';
import {isObject, isString, isUndefined, map} from "lodash";
import {qs} from "@/utils/index";
//获取某个元素的宽高
export function getDom(id: string, instance: ComponentInternalInstance | null): Promise<UniApp.NodeInfo | UniApp.NodeInfo[]> {
// const instance = getCurrentInstance();
return new Promise((resolve) => {
const query = uni.createSelectorQuery().in(instance);
query.select(id).boundingClientRect(data => {
resolve(data)
}).exec();
})
}
//获取当前路由
export function getRouter() {
const routes: any = getCurrentPages();
let options
//#ifdef H5
options = routes[routes.length - 1].$page.options
//#endif
//#ifdef MP-WEIXIN
options = routes[routes.length - 1]['options']
//#endif
return routes[routes.length - 1].route + qs(options)
}
//获取tabBar高度
export function getTabBarHeight() {
return uni.getSystemInfoSync().windowBottom
}
//获取顶部高度
export function getTopHeight() {
return uni.getSystemInfoSync().statusBarHeight
}
//获取底部安全区域高度
export function getSafeAreaHeight() {
return uni.getSystemInfoSync().safeAreaInsets?.bottom || 0
}
//保留当前页面跳转到应用内的某个页面使用uni.navigateBack可以返回到原页面。
export function navigateTo(OBJECT: UniNamespace.NavigateToOptions | string) {
if (isObject(OBJECT)) {
uni.navigateTo(OBJECT)
}
if (isString(OBJECT)) {
uni.navigateTo({url: OBJECT})
}
}
//关闭当前页面,跳转到应用内的某个页面。
export function redirectTo(OBJECT: UniNamespace.RedirectToOptions | string) {
if (isObject(OBJECT)) {
uni.redirectTo(OBJECT)
}
if (isString(OBJECT)) {
uni.redirectTo({url: OBJECT})
}
}
//关闭所有页面,打开到应用内的某个页面。
export function reLaunch(OBJECT: UniNamespace.ReLaunchOptions | string) {
if (isObject(OBJECT)) {
uni.reLaunch(OBJECT)
}
if (isString(OBJECT)) {
uni.redirectTo({url: OBJECT})
}
}
//跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。
export function switchTab(OBJECT: UniNamespace.SwitchTabOptions | string) {
if (isObject(OBJECT)) {
uni.switchTab(OBJECT)
}
if (isString(OBJECT)) {
uni.switchTab({url: OBJECT})
}
}
//关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages() 获取当前的页面栈,决定需要返回几层。
export function navigateBack(OBJECT?: UniNamespace.NavigateBackOptions) {
if (isObject(OBJECT)) {
uni.navigateBack(OBJECT)
}
if (isString(OBJECT) || isUndefined(OBJECT)) {
uni.navigateBack({delta: 1})
}
}
//判断是ios、android
export function getPlatform(): 'ios' | 'android' {
return uni.getSystemInfoSync().platform as 'ios' | 'android'
}
//获取屏幕宽
export function getWindowWidth() {
return uni.getSystemInfoSync().windowWidth
}
//获取屏幕高
export function getWindowHeight() {
return uni.getSystemInfoSync().windowHeight
}
//是否页面带有TabBar
export function isTabBar() {
return !!(pages as any).tabBar && (pages as any).tabBar.list.length > 0;
}
//显示消息提示框。
export function showToast(OBJECT: UniNamespace.ShowToastOptions | string) {
if (isObject(OBJECT)) {
uni.showToast(OBJECT)
}
if (isString(OBJECT)) {
uni.showToast({title: OBJECT, icon: 'none'})
}
}
//隐藏消息提示框
export function hideToast() {
uni.hideToast();
}
//显示 loading 提示框, 需主动调用 uni.hideLoading 才能关闭提示框。
export function showLoading(OBJECT: UniNamespace.ShowLoadingOptions | string) {
if (isObject(OBJECT)) {
uni.showLoading(OBJECT)
}
if (isString(OBJECT)) {
uni.showLoading({title: OBJECT})
}
}
//隐藏 loading 提示框。
export function hideLoading() {
uni.hideLoading()
}
//显示模态弹窗,可以只有一个确定按钮,也可以同时有确定和取消按钮。
export function showModal(OBJECT: UniNamespace.ShowModalOptions): Promise<UniNamespace.ShowModalRes> {
return new Promise((resolve, reject) => {
uni.showModal({
...OBJECT,
success: (result) => {
if (result.confirm) {
resolve(result)
}
if (result.cancel) {
reject(result)
}
},
fail: (err) => {
reject(err)
}
})
})
}
//从底部向上弹出操作菜单
export function showActionSheet(itemList: any[], key?: string) {
return new Promise((resolve, reject) => {
if (itemList.length > 0) {
let itemLists = itemList
if (isObject(itemList[0])) {
if (key) {
itemLists = map(itemList, key)
} else {
resolve('请传入对象展示字段')
return
}
}
uni.showActionSheet({
itemList: itemLists,
success: (result) => {
resolve({value: itemList[result.tapIndex], index: result.tapIndex, itemList})
},
fail: (err) => {
resolve(err)
}
})
} else {
resolve('数组长度为0')
}
})
}
export function getLocation(): Promise<UniNamespace.GetLocationSuccess> {
return new Promise(async (resolve, reject) => {
uni.getLocation({
type: 'gcj02',
success: (res) => {
resolve(res)
},
fail: (err) => {
reject(err)
}
})
})
}
//申请权限
export function requestPermissions(permissions: string, message: string) {
return new Promise((resolve, reject) => {
plus.android.requestPermissions([permissions], (resultObj) => {
let result = 0
for (let i = 0; i < resultObj.granted.length; i++) {
let grantedPermission = resultObj.granted[i];
if (permissions == grantedPermission) {
result = 1
}
}
for (let i = 0; i < resultObj.deniedPresent.length; i++) {
let deniedPresentPermission = resultObj.deniedPresent[i];
if (permissions == deniedPresentPermission) {
result = 0
}
}
for (let i = 0; i < resultObj.deniedAlways.length; i++) {
let deniedAlwaysPermission = resultObj.deniedAlways[i];
if (permissions == deniedAlwaysPermission) {
result = -1
}
}
if (result === 1) {
// @ts-ignore
resolve()
} else {
reject()
showToast({title: message, icon: 'none'})
}
})
})
}
//拨打电话。
export function makePhoneCall(phoneNumber: string) {
if (getPlatform() === 'android') {
requestPermissions('android.permission.CALL_PHONE', '请开启拨号权限').then(() => {
uni.makePhoneCall({
phoneNumber: phoneNumber,
success: (success) => {
console.log('success', success)
},
fail: (err) => {
console.log('err', err)
}
});
})
} else {
uni.makePhoneCall({
phoneNumber: phoneNumber,
success: (success) => {
console.log('success', success)
},
fail: (err) => {
console.log('err', err)
}
});
}
}
export function usePlayBackAudio(title: string, coverImgUrl: string) {
let bgAudioManager: UniNamespace.BackgroundAudioManager | null = null
function stop() {
if (bgAudioManager) {
bgAudioManager.stop()
bgAudioManager = null
}
}
stop()
function play(src: string, text: string, isVibrateLong = false) {
stop()
bgAudioManager = uni.getBackgroundAudioManager();
bgAudioManager.title = title;
bgAudioManager.singer = text;
bgAudioManager.coverImgUrl = coverImgUrl;
bgAudioManager.src = src;
bgAudioManager.play()
if (isVibrateLong) {
uni.vibrateLong({});
}
}
return {play, stop}
}
//获取设备唯一
export function getIdfa() {
let idfa = '';
try {
if ('ios' == getPlatform()) {
// @ts-ignore
idfa = plus.device.uuid
}
if ('android' == getPlatform()) {
let mainActivity: any = plus.android.runtimeMainActivity();
let Settings: any = plus.android.importClass("android.provider.Settings");
idfa = Settings.Secure.getString(mainActivity.getContentResolver(), Settings.Secure.ANDROID_ID)
}
} catch (e) {
console.error('exception in getIdfa@dc-idfa!!', e);
}
return idfa;
}
//退出app
export function exitApp() {
if (uni.getSystemInfoSync().osName == 'ios') {
//@ts-ignore
plus.ios.import("UIApplication").sharedApplication().performSelector("exit")//退出
}
if (uni.getSystemInfoSync().osName == 'android') {
plus.runtime.quit(); //退出
}
}
//跳转到外部打开
export function openURL(url: string) {
plus.runtime.openURL(url)
}
//重启app
export function restartApp() {
plus.runtime.restart()
}
//跳转到应用设置权限位置
export function goSettings() {
if (getPlatform() === 'android') {
let Intent = plus.android.importClass("android.content.Intent");
let Settings = plus.android.importClass("android.provider.Settings");
let Uri = plus.android.importClass("android.net.Uri");
let mainActivity = plus.android.runtimeMainActivity();
// @ts-ignore
let intent = new Intent();
// @ts-ignore
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
// @ts-ignore
let uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
intent.setData(uri);
// @ts-ignore
mainActivity.startActivity(intent);
}
if (getPlatform() === 'ios') {
// @ts-ignore
let UIApplication = plus.ios.import("UIApplication");
let application2 = UIApplication.sharedApplication();
// @ts-ignore
let NSURL2 = plus.ios.import("NSURL");
let setting2 = NSURL2.URLWithString("app-settings:");
application2.openURL(setting2);
plus.ios.deleteObject(setting2);
plus.ios.deleteObject(NSURL2);
plus.ios.deleteObject(application2);
}
}
//打开第三方导航
export function openLocation(OBJECT: { latitude: number, longitude: number, name: string, address: string }) {
uni.openLocation(OBJECT)
}
//设置标题
export function setTitle(title: string) {
uni.setNavigationBarTitle({title});
}
//发起支付宝支付
export function alipayPay(orderInfo: any) {
return new Promise((resolve, reject) => {
uni.requestPayment({
provider: 'alipay',
orderInfo,
success: (res) => {
resolve(res)
},
fail: (err) => {
showModal({
content: '支付失败',
showCancel: false
})
}
});
});
}
// 发起微信支付
export function wxPay(orderInfo: any) {
return new Promise((resolve, reject) => {
uni.requestPayment({
provider: "wxpay",
timeStamp: orderInfo.timestamp,
nonceStr: orderInfo.noncestr,
package: orderInfo.package,
signType: "MD5",
paySign: orderInfo.sign,
orderInfo: {
appid: orderInfo.appid,
noncestr: orderInfo.noncestr,
package: orderInfo.package,
partnerid: orderInfo.partnerid,
prepayid: orderInfo.prepayid,
timestamp: orderInfo.timestamp,
sign: orderInfo.sign,
},
success: (res) => {
resolve(res)
},
fail: async (err) => {
await showModal({
content: '支付失败',
showCancel: false
})
}
});
});
}
//将程序移动到后台
export function moveAppToBackground() {
let main: any = plus.android.runtimeMainActivity();
main.moveTaskToBack(false);
}