Files
ReadViewSDK/Sources/RDReaderView/EPUBCore/RDEPUBWebViewDebug.swift
T
shenandshen 54798ba578 refactor: 添加中文注释 + 优化模块结构
- 给全部 78 个 Swift 源文件添加详细的中文注释(文件级、类级、方法级)
- 删除 LegacyRDReaderController/ 死代码目录(16 文件 4592 行)
- 根目录翻页容器文件移入 ReaderView/ 目录
- Resources/ 移入 EPUBCore/Resources/(与使用者归属一致)
- RDEPUBTextIndexTable.swift 移入 EPUBTextRendering/(消除反向依赖)
- RDURLReaderController.swift 移入 EPUBUI/(入口控制器归入 UI 层)
- 更新 podspec 资源路径
2026-05-25 10:19:14 +08:00

84 lines
3.5 KiB
Swift

// RDEPUBWebViewDebug.swift
// WebView 调试日志工具
// 提供统一的调试日志输出接口,支持导航事件、JS 执行、
// 消息接收、URL Scheme 任务等场景的日志记录。
// DEBUG 模式默认开启,Release 模式默认关闭,可通过 UserDefaults 覆盖。
import Foundation
import WebKit
/// WebView 调试日志工具集
enum RDEPUBWebViewDebug {
/// 调试日志是否启用(DEBUG 默认开启,可通过 UserDefaults "RDEPUBWebViewDebugEnabled" 覆盖)
static var isEnabled: Bool = {
if let configured = UserDefaults.standard.object(forKey: "RDEPUBWebViewDebugEnabled") as? Bool {
return configured
}
#if DEBUG
return true
#else
return false
#endif
}()
/// 获取 WebView 的十六进制标识符(用于日志区分多个 WebView 实例)
static func webViewID(_ webView: WKWebView?) -> String {
guard let webView else { return "nil-webview" }
return String(ObjectIdentifier(webView).hashValue, radix: 16)
}
/// 输出通用日志
static func log(_ scope: String, message: String) {
guard isEnabled else { return }
print("[RDReaderWK][\(scope)] \(message)")
}
/// 输出导航事件日志(含 WebView ID、事件类型、URL、错误信息)
static func logNavigationEvent(_ scope: String, webView: WKWebView?, event: String, url: URL? = nil, error: Error? = nil) {
guard isEnabled else { return }
let webViewToken = webViewID(webView)
let urlText = summarizedURL(url)
if let error {
log(scope, message: "webView=\(webViewToken) event=\(event) url=\(urlText) error=\(error.localizedDescription)")
} else {
log(scope, message: "webView=\(webViewToken) event=\(event) url=\(urlText)")
}
}
/// 输出 JavaScript 执行日志
static func logJavaScript(_ scope: String, webView: WKWebView?, action: String, details: String) {
guard isEnabled else { return }
log(scope, message: "webView=\(webViewID(webView)) js=\(action) \(details)")
}
/// 输出 JS 消息接收日志(含消息名称和消息体)
static func logMessage(_ scope: String, webView: WKWebView?, name: String, body: Any) {
guard isEnabled else { return }
log(scope, message: "webView=\(webViewID(webView)) message=\(name) body=\(String(describing: body))")
}
/// 输出 URL Scheme 任务日志(含请求 URL、文件 URL、事件类型、错误信息)
static func logSchemeTask(_ scope: String, requestURL: URL?, fileURL: URL? = nil, event: String, error: Error? = nil) {
guard isEnabled else { return }
let requestText = summarizedURL(requestURL)
let fileText = summarizedURL(fileURL)
if let error {
log(scope, message: "scheme=\(event) request=\(requestText) file=\(fileText) error=\(error.localizedDescription)")
} else {
log(scope, message: "scheme=\(event) request=\(requestText) file=\(fileText)")
}
}
/// 截取 URL 的摘要信息(ss-reader:// 协议显示完整 URL,其他显示最后路径组件)
static func summarizedURL(_ url: URL?) -> String {
guard let url else { return "nil" }
if let scheme = url.scheme, scheme == RDEPUBResourceURLSchemeHandler.scheme {
return url.absoluteString
}
let path = url.path
if path.isEmpty {
return url.absoluteString
}
return url.lastPathComponent.isEmpty ? path : url.lastPathComponent
}
}