<template> <web-view class="webview" @message="webLoad" style="flex: 1;" :src="config.h5Url"></web-view> </template> <script setup> import { ref } from 'vue' import config from "../../config"; import {onExit } from "@dcloudio/uni-app"; import { Communication } from '../../utils/communication.js'; const commun=new Communication() import { registerRequestPermissionTipsListener, unregisterRequestPermissionTipsListener, setRequestPermissionTips } from "@/uni_modules/uni-registerRequestPermissionTips" const PermissionTips = { "android.permission.READ_PHONE_STATE": "<h4 style=\"font-size:40px;\">正在读取网络状态权限</h4><font color=#cccccc>通讯录权限不会获取任何信息,请注意通讯录权限不会获取任何信息,请注意通讯录权限不会获取任何信息,请注意</font>", "android.permission.CAMERA": "<h4 style=\"font-size:40px;\">正在访问相机权限</h4><font color=#cccccc>需要扫描二维码或拍照,是否允许打开相机?</font>", "android.permission.WRITE_EXTERNAL_STORAGE": "<h4 style=\"font-size:40px;\">正在读取相册权限</h4><font color=#cccccc>我们需要获取访问您设备相册的权限,以便您能够选择并上传图片或视频到我们的应用中。</font>" } onExit(()=>{ unregisterRequestPermissionTipsListener() }) const brand = uni.getSystemInfoSync().deviceBrand setRequestPermissionTips(PermissionTips) registerRequestPermissionTipsListener({ onRequest: (e) => { console.log('onRequest',e) }, onConfirm: (e) => { commun.sendToH5('permission-application',{action:'open-permission',data:e}); }, onComplete: (e) => { commun.sendToH5('permission-application',{action:'close-permission',data:e}); // 华为手机在权限禁止之后,再次申请权限不会出现权限申请框。此时应该引导用户去系统设置开启此权限,不应该频繁申请。 if (brand.toLowerCase() === "huawei") { const tips = {} let hasDeniedPermission = false for (let k in PermissionTips) { if (e[k] !== "denied") { tips[k] = PermissionTips[k] } else { hasDeniedPermission = true } } setRequestPermissionTips(tips) // 更新弹框提醒,防止华为手机不出现权限申请框时权限提醒框闪烁的情况 if (hasDeniedPermission) uni.showModal({ content: "权限已经被拒绝,请前往设置中开启" }) } } }) function initializeWebView() { const currentWebview = getCurrentPages().pop().$getAppWebview() commun.setWebView(currentWebview.children()[0]) } //load-complete 注册函数 commun.registerHandler('load-complete',()=>{ initializeWebView() const {statusBarHeight} = uni.getSystemInfoSync() commun.webViewObj.setStyle({ top: statusBarHeight, bottom: 0, }) }) commun.registerHandler('getLocation',(data)=>{ uni.getLocation({ type:'gcj02', geocode:true, isHighAccuracy:true, ...data, success: (res) => { console.log('getLocation',res) commun.sendToH5('getLocation',res); }, }) }) const webLoad = (e) => { const message = e.detail.data?.[0] || ''; commun.handleMessage(message); }; </script> <style> </style>