From 33a3c48272eb5b0f57e952a539916db7a244bd02 Mon Sep 17 00:00:00 2001
From: hejianhao <15708179461@qq.com>
Date: 星期五, 21 八月 2026 10:21:16 +0800
Subject: [PATCH] feat0806: 退出直播间不清理缓存

---
 traditionalApp/pages/webview/webview.vue |  133 +-------------------------------------------
 1 files changed, 3 insertions(+), 130 deletions(-)

diff --git a/traditionalApp/pages/webview/webview.vue b/traditionalApp/pages/webview/webview.vue
index b8fe59d..951bbb6 100644
--- a/traditionalApp/pages/webview/webview.vue
+++ b/traditionalApp/pages/webview/webview.vue
@@ -10,6 +10,7 @@
 <script setup lang="ts">
 import { ref } from 'vue'
 import { onLoad, onUnload } from '@dcloudio/uni-app'
+import { clearWebViewData } from '@/utils/webview-cache.js'
 
 const webViewUrl = ref('')
 let currentWebviewInstance: any = null
@@ -44,139 +45,11 @@
 })
 
 /**
- * 页面卸载时清除 WebView 缓存和 Cookie
+ * 页面卸载时不再清理缓存:清理集中在进入直播间前与退出登录时执行。
  */
 onUnload(() => {
-	console.log('[WebView] 页面卸载,开始清除缓存')
-	clearWebViewData()
+	console.log('[WebView] 页面卸载')
 })
-
-/**
- * 清除所有 WebView 的缓存、Cookie 和存储数据。
- * 原生 API 可清掉 HttpOnly cookie 和按域名隔离的 localStorage;
- * evalJS 仅作为兜底,清掉非 HttpOnly cookie 和当前页 storage。
- */
-function clearWebViewData() {
-	try {
-		// #ifdef APP-PLUS
-		// 1. 原生 API 清理(核心:能清掉 HttpOnly cookie 和所有域名的 localStorage)
-		const platform = String(uni.getSystemInfoSync().platform || '').toLowerCase()
-		if (platform === 'android') {
-			clearAndroidWebViewData()
-		} else if (platform === 'ios') {
-			clearIOSWebViewData()
-		}
-
-		// 2. plus.webview API 兜底:清 HTTP 资源缓存,并注入 JS 清当前页 cookie/storage
-		try {
-			const allWebviews = plus.webview.all()
-			if (allWebviews && allWebviews.length > 0) {
-				allWebviews.forEach((webview) => {
-					try {
-						if (webview && typeof webview.clearCache === 'function') {
-							webview.clearCache()
-						}
-						if (webview && typeof webview.evalJS === 'function') {
-							webview.evalJS(`
-								try {
-									document.cookie.split(";").forEach(function(c) {
-										document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/");
-									});
-									if (window.localStorage) localStorage.clear();
-									if (window.sessionStorage) sessionStorage.clear();
-								} catch (e) {}
-							`)
-						}
-					} catch (e) {}
-				})
-				console.log('[WebView] 所有 WebView HTTP 缓存已清除,共 ' + allWebviews.length + ' 个')
-			}
-		} catch (e) {}
-		// #endif
-	} catch (error) {
-		console.error('[WebView] 清除数据失败:', error)
-	}
-}
-
-/**
- * Android 原生清理:清所有域名 Cookie(含 HttpOnly)+ WebStorage + 表单数据。
- */
-function clearAndroidWebViewData() {
-	try {
-		// 清所有域名 Cookie(包括 HttpOnly),CookieManager 是全局按域名共享的
-		const CookieManager = plus.android.importClass('android.webkit.CookieManager')
-		if (CookieManager) {
-			const cm = CookieManager.getInstance()
-			try { cm.removeAllCookie() } catch (e) {}     // 老版本 API(API 21 以下)
-			try { cm.flush() } catch (e) {}              // 立即写入磁盘
-			console.log('[WebView][Android] CookieManager 已清所有 Cookie')
-		}
-
-		// 清所有域名的 localStorage / sessionStorage(WebStorage 是全局按域名共享的)
-		const WebStorage = plus.android.importClass('android.webkit.WebStorage')
-		if (WebStorage) {
-			const ws = WebStorage.getInstance()
-			try { ws.deleteAllData() } catch (e) {}
-			console.log('[WebView][Android] WebStorage 已清所有 localStorage')
-		}
-
-		// 清表单数据和密码(可选)
-		try {
-			const WebViewDatabase = plus.android.importClass('android.webkit.WebViewDatabase')
-			const context = plus.android.runtime.appContext
-			if (WebViewDatabase && context) {
-				const db = WebViewDatabase.getInstance(context)
-				if (db && typeof db.clearFormData === 'function') {
-					db.clearFormData()
-				}
-			}
-		} catch (e) {}
-	} catch (e) {
-		console.error('[WebView][Android] 原生清理失败:', e)
-	}
-}
-
-/**
- * iOS 原生清理:清 NSHTTPCookieStorage 所有 Cookie;并用 WKWebsiteDataStore 清 WKWebView 数据。
- */
-function clearIOSWebViewData() {
-	// 1. NSHTTPCookieStorage.deleteAllCookies(UIWebView 与部分 WKWebView 共享)
-	try {
-		const NSHTTPCookieStorage = plus.ios.importClass('NSHTTPCookieStorage')
-		if (NSHTTPCookieStorage) {
-			const storage = NSHTTPCookieStorage.sharedHTTPCookieStorage()
-			if (storage) {
-				try { plus.ios.invoke(storage, 'deleteAllCookies') } catch (e) {}
-				console.log('[WebView][iOS] NSHTTPCookieStorage 已清所有 Cookie')
-			}
-		}
-	} catch (e) {
-		console.error('[WebView][iOS] NSHTTPCookieStorage 清理失败:', e)
-	}
-
-	// 2. WKWebsiteDataStore.removeDataOfTypes(iOS 9+,清 WKWebView 的 cookie/localStorage/cache)
-	// block 部分用空 block 代替,调用 plus.ios.invoke
-	try {
-		const WKWebsiteDataStore = plus.ios.importClass('WKWebsiteDataStore')
-		if (!WKWebsiteDataStore) {
-			return
-		}
-		const allTypes = WKWebsiteDataStore.allWebsiteDataTypes()
-		const defaultStore = WKWebsiteDataStore.defaultDataStore()
-		const NSDate = plus.ios.importClass('NSDate')
-		const distantPast = NSDate ? NSDate.distantPast() : null
-		// completionHandler 传一个空 block,避免 native 崩溃
-		const noopHandler = function () {}
-		try {
-			plus.ios.invoke(defaultStore, 'removeDataOfTypes:modifiedAt:completionHandler:', allTypes, distantPast, noopHandler)
-			console.log('[WebView][iOS] WKWebsiteDataStore 已清所有数据')
-		} catch (e) {
-			console.error('[WebView][iOS] WKWebsiteDataStore 调用失败:', e)
-		}
-	} catch (e) {
-		console.error('[WebView][iOS] WKWebsiteDataStore 初始化失败:', e)
-	}
-}
 
 /**
  * 解码路由参数,异常时回退为空字符串。

--
Gitblit v1.7.1