diff --git a/OrderScheduling/Common/WebView/WebViewController.swift b/OrderScheduling/Common/WebView/WebViewController.swift index f75d222..fb342a3 100644 --- a/OrderScheduling/Common/WebView/WebViewController.swift +++ b/OrderScheduling/Common/WebView/WebViewController.swift @@ -6,6 +6,7 @@ // import Foundation +import UIKit import WebKit import SnapKit import DDLogKit_Private @@ -154,10 +155,76 @@ extension WebViewController : WKScriptMessageHandler { let code = params?["code"] as? String let vc = VehicleMonitorHistoryController(code: code) navigationController?.pushViewController(vc, animated: true) + } else if action == "copyToClipboard" { + let paramsAny = dict?["params"] + + var output: String? = nil + + if let paramsDict = paramsAny as? [String: Any] { + if let t = (paramsDict["text"] as? String) ?? (paramsDict["value"] as? String) { + let trimmed = t.trimmingCharacters(in: .whitespacesAndNewlines) + if trimmed.isEmpty == false { output = trimmed } + } + if output == nil { + output = dictToMultilineKV(paramsDict) + } + } else if let paramsStr = paramsAny as? String { + if let multiline = jsonToMultilineKV(paramsStr) { + output = multiline + } else { + let trimmed = paramsStr.trimmingCharacters(in: .whitespacesAndNewlines) + if trimmed.isEmpty == false { output = trimmed } + } + } + + let finalText = (output ?? "").trimmingCharacters(in: .whitespacesAndNewlines) + guard finalText.isEmpty == false else { + view.dd_makeToast("复制内容为空") + return + } + + DispatchQueue.main.async {[weak self] in + UIPasteboard.general.string = finalText + self?.view.dd_makeToast("已复制") + } } } } +private func unwrapEscapedJSONString(_ raw: String) -> String { + let trimmed = raw.trimmingCharacters(in: .whitespacesAndNewlines) + if trimmed.hasPrefix("\""), trimmed.hasSuffix("\""), trimmed.count >= 2 { + return String(trimmed.dropFirst().dropLast()) + .replacingOccurrences(of: "\\\"", with: "\"") + .replacingOccurrences(of: "\\\\", with: "\\") + } + return trimmed +} + +func jsonToMultilineKV(_ json: String) -> String? { + let s = unwrapEscapedJSONString(json) + guard let data = s.data(using: .utf8) else { return nil } + + guard let obj = try? JSONSerialization.jsonObject(with: data, options: []) else { return nil } + + guard let dict = obj as? [String: Any] else { return nil } + return dictToMultilineKV(dict) +} + +func dictToMultilineKV(_ dict: [String: Any]) -> String { + + let lines = dict + .map { (k, v) -> String in + let key = k.trimmingCharacters(in: .whitespacesAndNewlines) + .replacingOccurrences(of: ":", with: ":") + let keyOut = key.hasSuffix(":") ? key : (key + ":") + return "\(keyOut)\(String(describing: v))" + } + .sorted() + + return lines.joined(separator: "\n") +} + extension WebViewController : WKNavigationDelegate,WKUIDelegate { public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { view.dd_hideHUD()