131 lines
4.2 KiB
JavaScript
131 lines
4.2 KiB
JavaScript
import { ref, onMounted } from "vue";
|
||
import "@/assets/uni-webview"
|
||
|
||
export function useWebView() {
|
||
const platform = ref("");
|
||
const token = ref("");
|
||
// 检测环境并通知父窗口加载完毕
|
||
const handleBridgeReady = () => {
|
||
if (platform.value) {
|
||
h5PostMessage("loaded", true);
|
||
}
|
||
};
|
||
|
||
|
||
// 获取 Token(从 URL 中解析)
|
||
const getTokenFromUrl = () => {
|
||
const urlParams = new URLSearchParams(window.location.search);
|
||
const tokenFromUrl = urlParams.get("token");
|
||
token.value = tokenFromUrl || ""; // 如果 URL 没有 token,返回空字符串
|
||
if (token.value) {
|
||
localStorage.setItem("token", token.value);
|
||
}
|
||
return tokenFromUrl;
|
||
};
|
||
|
||
// 封装 postMessage 方法
|
||
const postMessage = (data) => {
|
||
if (platform.value === "h5") {
|
||
h5PostMessage("postMessage", data);
|
||
} else if (uni && uni.webView.postMessage) {
|
||
uni.webView.postMessage(data);
|
||
} else {
|
||
console.error("uni.webView.postMessage is not available.");
|
||
}
|
||
};
|
||
|
||
const redirectTo = (data) => {
|
||
if (platform.value === "h5") {
|
||
h5PostMessage("redirectTo", data)
|
||
} else if (uni && uni.webView.redirectTo) {
|
||
// 非 H5 环境,调用 uni.webView.redirectTo
|
||
uni.webView.redirectTo(data);
|
||
} else {
|
||
console.error("uni.webView.redirectTo is not available.");
|
||
}
|
||
};
|
||
|
||
// 封装 navigateBack 方法
|
||
const navigateBack = (data) => {
|
||
if (platform.value === "h5") {
|
||
window.top.history.back();
|
||
// h5PostMessage("navigateBack", data)
|
||
} else if (uni && uni.webView.navigateBack) {
|
||
// 非 H5 环境,调用 uni.webView.navigateBack
|
||
uni.webView.navigateBack(data);
|
||
} else {
|
||
console.error("uni.webView.navigateBack is not available.");
|
||
}
|
||
};
|
||
|
||
// 封装 navigateTo 方法
|
||
const navigateTo = (data) => {
|
||
if (platform.value === "h5") {
|
||
// h5PostMessage("navigateTo", data)
|
||
window.top.location.href = "/app" + data.url
|
||
} else if (uni && uni.webView.navigateTo) {
|
||
uni.webView.navigateTo(data);
|
||
} else {
|
||
console.error("uni.webView.navigateTo is not available.");
|
||
}
|
||
};
|
||
const payment = (data) => {
|
||
if (platform.value === "h5") {
|
||
h5PostMessage("payment", data)
|
||
} else if (uni && uni.webView.navigateTo) {
|
||
// 非 H5 环境,调用 uni.webView.navigateTo
|
||
uni.webView.navigateTo(data);
|
||
} else {
|
||
console.error("uni.webView.navigateTo is not available.");
|
||
}
|
||
}
|
||
const getEnv = () => {
|
||
return new Promise((resolve, reject) => {
|
||
let env = localStorage.getItem(platform)
|
||
if (env) {
|
||
platform.value = env
|
||
resolve(env);
|
||
} else {
|
||
uni.webView.getEnv((env) => {
|
||
// 遍历 env 对象,找到值为 true 的键
|
||
const platformKey = Object.keys(env).find(key => env[key] === true);
|
||
platform.value = platformKey;
|
||
if (platformKey) {
|
||
resolve(platformKey); // 返回键名(如 'h5', 'mp-weixin' 等)
|
||
} else {
|
||
reject('未知平台');
|
||
}
|
||
});
|
||
}
|
||
});
|
||
};
|
||
|
||
onMounted(async () => {
|
||
try {
|
||
const envValue = await getEnv();
|
||
console.log("当前环境", envValue)
|
||
// 将返回的键名(如 'h5', 'mp-weixin')存储到 platform
|
||
handleBridgeReady();
|
||
} catch (error) {
|
||
console.error(error);
|
||
}
|
||
// 获取 Token
|
||
getTokenFromUrl();
|
||
});
|
||
|
||
return {
|
||
platform,
|
||
token,
|
||
getEnv,
|
||
redirectTo,
|
||
postMessage,
|
||
navigateTo,
|
||
navigateBack,
|
||
payment
|
||
};
|
||
}
|
||
const h5PostMessage = (action, data) => {
|
||
window.parent.postMessage({ action, data, messageId: generateUniqueId(action) }, "*");
|
||
}
|
||
const generateUniqueId = (action) => `msg_${action}_${new Date().getTime()}`;
|