// // ImageProvider.swift // ylgamehall // // 分享场景的图片源 helper: // - captureScreenshot() 截当前 keyWindow(与 msext FuncPublic // getImageWithFullScreenshot 等价) // - downloadRemote(_:) URLSession 异步下载远端图片 URL // // Phase 4.F 截图 / 远端图分享共用。 // import UIKit public enum ImageProviderError: Error, Sendable { case noKeyWindow case downloadFailed(any Error) case decodeFailed case badURL(String) } @MainActor public enum ImageProvider { /// 截当前 keyWindow(与 msext `getImageWithFullScreenshot` 等价)。 /// 返回包含状态栏 + 大厅 letterbox 黑边 + WebView 内容的完整快照。 public static func captureScreenshot() throws -> UIImage { guard let window = UIApplication.shared.connectedScenes .compactMap({ $0 as? UIWindowScene }) .flatMap(\.windows) .first(where: { $0.isKeyWindow }) else { throw ImageProviderError.noKeyWindow } let renderer = UIGraphicsImageRenderer(bounds: window.bounds) return renderer.image { _ in window.drawHierarchy(in: window.bounds, afterScreenUpdates: false) } } /// 下载远端 URL → UIImage。仅简单 URLSession 同步路径,无重试 / 缓存。 public static func downloadRemote(_ urlString: String) async throws -> UIImage { guard let url = URL(string: urlString) else { throw ImageProviderError.badURL(urlString) } do { let (data, _) = try await URLSession.shared.data(from: url) guard let image = UIImage(data: data) else { throw ImageProviderError.decodeFailed } return image } catch let err as ImageProviderError { throw err } catch { throw ImageProviderError.downloadFailed(error) } } }