Wails v3 Dev 示例指南:用 `private_mac_apis` 构建 macOS 半透明毛玻璃窗口
Wails v3 Dev 示例指南用private_mac_apis构建 macOS 半透明毛玻璃窗口【免费下载链接】wailsCreate beautiful applications using Go项目地址: https://gitcode.com/gh_mirrors/wa/wails本指南围绕 v3/examples/dev/README.md 展开讲解 Wails v3 开发示例dev example中如何使用 macOS 原生毛玻璃translucent backdrop效果通过private_mac_apis构建标签让 WKWebView 变透明从而透出背后的原生模糊背景。读完本文你将掌握该示例的完整运行方式、透明 WebView 的底层实现原理、无标签时的回退行为以及生产构建的注意事项。示例定位与当前状态dev示例位于仓库的 v3/examples/dev 目录是 Wails v3 众多示例之一用于演示原始 HTML CSS形态的窗口应用。需要注意的是README 明确标注NOTE: This example is currently a work in progress. It is not yet ready for use.也就是说该示例目前仍是进行中的工作work in progress尚未准备好作为正式样板使用。整个 v3 示例集在 alpha 开发阶段随时可能无法编译或运行见 v3/examples/README.md 顶部说明运行前需以当前仓库实际状态为准。该示例的独特之处在于它演示了一个视觉特性组合半透明translucent的 macOS 原生背景frosted glass 毛玻璃效果覆盖其上的透明 WebView前端内容直接浮在毛玻璃上隐藏式内嵌标题栏hidden inset title bar保留左上角标准红绿灯按钮。其中透明 WebView是演示的关键而它恰恰依赖 Apple 的私有 API这正是private_mac_apis构建标签存在的意义。为什么需要private_mac_apis透明 WebView 与原生毛玻璃技术背景WKWebView 没有公开的透明开关macOS 原生毛玻璃背景由NSVisualEffectView实现见 webview_window_darwin.go 中windowSetTranslucent的 C 实现创建 effect view、设为NSVisualEffectBlendingModeBehindWindow、active 状态并垫在内容视图之下。然而要让毛玻璃显形覆盖其上的 WKWebView 必须允许背景穿透——而WKWebView 没有任何公开 API 可以关闭背景绘制。Wails v3 的解决方案是使用一个由 WebKit 自 WebKit1 时代就遵循的私有属性。在 mac_private_api_darwin.go 中可以读到这段被注释明确标注为整个 Wails v3 中唯一调用未文档化 macOS API 的地方的代码// WKWebView has no public API for drawing without a background. This key is // backed by a private property that WebKit has honoured since WebKit1. void wailsPrivateSetWebviewTransparent(void *webView) { WKWebView *view (WKWebView *)webView; if (view nil) { return; } try { [view setValue:NO forKey:drawsBackground]; } catch (NSException *exception) { NSLog([Wails] Could not make the webview transparent: %, exception.reason); } }即通过 KVC 给 WKWebView 设置私有键drawsBackground NO并用try/catch包裹以保证在私有属性不可用时仅记录日志、不导致崩溃。该 C 桥接函数经由 webview_window_darwin.go 的webviewSetTransparent暴露给 Go 层调用。构建标签如何选择实现同一组函数存在两份实现由 Go 构建标签build constraints决定编译哪一份文件构建约束行为mac_private_api_darwin.godarwin !ios !server private_mac_apis调用私有 APIWebView 透明、私有玻璃样式、私有 inspector 等mac_public_api_darwin.godarwin !ios !server !private_mac_apis公开 API 替代方案或无操作no-op两份实现保持完全相同的 C 函数签名桥接头文件 mac_private_api_darwin.h 注释也强调Internal bridge only; the public Go API is identical in both builds因此 Go 层代码无需任何条件编译。差异只在视觉结果上没有标签时wailsPrivateSetWebviewTransparent变成空操作——WebView 保持不透明毛玻璃背景被完全遮挡这正是 dev 示例 README 描述的回退现象。运行 dev 示例环境要求macOS毛玻璃效果仅在 macOS 上体现已安装 Go 工具链与 Node.js/npm前端构建需要 npm仓库 v3 模块的 Go 依赖首次可先执行go mod tidy。构建前端必做dev 示例通过 Go 的embed指令内嵌前端产物main.go//go:embed frontend/dist var assets embed.FS因此必须先构建前端否则frontend/dist目录不存在go run会直接失败。在前端目录执行cd v3/examples/dev/frontend npm install npm run buildnpm run build对应 package.json 中的vite build产物输出到frontend/dist。示例仓库的 TaskfileTaskfile.yml也封装了同样流程install-frontend-deps任务负责npm installbuild-frontend任务负责npm run build可由wails3 task build-frontend触发。注意README 特别说明先构建前端是此 work-in-progress 示例的既有要求构建标签并不会改变这一前提。使用私有 API 运行推荐效果回到示例根目录带构建标签运行cd v3/examples/dev go run -tags private_mac_apis .此时窗口呈现完整效果半透明毛玻璃背景 透明 WebView 隐藏内嵌标题栏。仅使用公开 API 运行省略标签即可go run .效果差异WebView 变为不透明浮在原生毛玻璃背景之上视觉上回到普通窗口。应用本身照常运行。标签的平台影响范围private_mac_apis标签只影响 macOS对 Windows、Linux、iOS、Android没有任何效果iOS 示例需要此标签的唯一场景是运行其 macOS 桌面变体见 v3/examples/README.md 的说明在非 macOS 平台使用该标签也不会报错只是无实际作用。源码拆解示例是如何配置毛玻璃的应用入口与资源服务main.go 结构简洁func main() { app : application.New(application.Options{ Name: dev, Description: A demo of using raw HTML CSS, Assets: application.AssetOptions{ Handler: application.AssetFileServerFS(assets), }, Mac: application.MacOptions{ ApplicationShouldTerminateAfterLastWindowClosed: true, }, }) // Create window app.Window.NewWithOptions(application.WebviewWindowOptions{ Title: Plain Bundle, CSS: body { background-color: rgba(255, 255, 255, 0); } .main { color: white; margin: 20%; }, Mac: application.MacWindow{ InvisibleTitleBarHeight: 50, Backdrop: application.MacBackdropTranslucent, TitleBar: application.MacTitleBarHiddenInset, }, URL: /, }) err : app.Run() if err ! nil { log.Fatal(err) } }三个值得注意的细节CSS 中把 body 背景设为透明rgba(255, 255, 255, 0)——即使 WebView 本身透明页面自己的背景若是不透明的白色依然会挡住毛玻璃。透明 WebView 与透明页面背景缺一不可。application.AssetFileServerFS(assets)将内嵌的frontend/dist作为静态资源服务URL: /加载其首页。MacOptions.ApplicationShouldTerminateAfterLastWindowClosed让关闭最后一个窗口后应用退出。Backdrop 选项的四种取值MacBackdrop类型定义于 webview_window_options.go常量效果MacBackdropNormal默认值窗口为普通不透明背景MacBackdropTransparent窗口背景透明透出下方内容MacBackdropTranslucent窗口背景半透明毛玻璃/磨砂效果示例所用MacBackdropLiquidGlass使用 Apple 的 Liquid Glass 效果macOS 15.0老系统回退到 translucent这些值在 webview_window_darwin.go 中被消费switch macOptions.Backdrop { case MacBackdropTransparent: C.windowSetTransparent(w.nsWindow) C.webviewSetTransparent(w.nsWindow) case MacBackdropTranslucent: C.windowSetTranslucent(w.nsWindow) C.webviewSetTransparent(w.nsWindow) case MacBackdropLiquidGlass: w.applyLiquidGlass() case MacBackdropNormal: }可以看到MacBackdropTranslucent的调用链windowSetTranslucent垫入 NSVisualEffectView 毛玻璃层→webviewSetTransparent调用私有 API 让 WebView 透明。MacBackdropTransparent则跳过毛玻璃层、只做透明。这两个分支都依赖wailsPrivateSetWebviewTransparent因此没有private_mac_apis标签时透明化均不生效。隐藏内嵌标题栏MacTitleBarHiddenInset是框架预置的标题栏配置之一webview_window_options.govar MacTitleBarHiddenInset MacTitleBar{ AppearsTransparent: true, Hide: false, HideTitle: true, FullSizeContent: true, UseToolbar: true, HideToolbarSeparator: true, }配合InvisibleTitleBarHeight: 50隐藏标题栏区域仍保留 50pt 的可拖动高度同时左上角保留标准红绿灯按钮traffic lights。其他预置项还包括MacTitleBarHidden、MacTitleBarHiddenInsetUnified与MacTitleBarDefault可按需替换。无标签时的回退行为不带-tags private_mac_apis构建时编译的是 mac_public_api_darwin.go。其中每个私有调用都有对应实现整体遵循Go API 不变视觉结果不同的原则WebView 透明wailsPrivateSetWebviewTransparent直接为空操作(void)webView;因为 macOS 没有公开的透明度开关。结果WebView 不透明地覆盖在毛玻璃上WebView 背景色改用公开 API——macOS 12 用WKWebView.underPageBackgroundColor更早系统用wantsLayer layer.backgroundColor玻璃样式Liquid Glass 的 light/dark 通过NSAppearanceAqua/DarkAqua近似表达无原生对应值跨窗口玻璃分组GroupID/GroupSpacing无公开 AppKit 等价物直接空操作——每个玻璃视图保持独立DevTools inspectorwailsPrivateOpenWebInspector变为空操作程序化打开 Inspector 的调用无效。因此示例 README 中没有标签时示例在原生背景之上运行不透明 WebView的说明与源码行为完全一致。生产构建与 DevTools 注意事项dev 示例 README 指出生产构建细节可参考 v3/examples/README.md 的shared private API guide。该指南给出了通用结论直接用 Go 构建生产二进制go build -tags production,private_mac_apis .生产构建默认禁用 inspector。若需在生产示例中保留 inspector 快捷键需额外加devtools标签go build -tags production,devtools,private_mac_apis .macOS 13.3 在开发构建或带devtools的构建中Safari 检查Safari inspection无需私有 API 即可用见 webview_window_options.go 对OpenInspectorOnStartup的注释。私有 inspector 代码本身也被#ifdef WAILS_MAC_DEVTOOLS保护mac_private_api_darwin.go普通生产构建绝不包含私有 inspector selector只有开发构建或productiondevtools才编译进去。_WKInspector的私有接口同样只在此条件下声明。同类示例与标签使用矩阵dev 示例并非唯一需要该标签的示例。v3/examples/README.md 给出了完整的标签适用矩阵场景需要标签的原因无标签的表现badge、contextmenus、dev、dock、drag-n-drop、spotlight、screen、wml 等 20 个示例透明 WebView 覆盖在半透明原生背景之上WebView 保持不透明liquid-glassWebView 透明 既有原生玻璃样式不透明 WebView退化为公开样式替代方案notch-notification刘海窗口内的 WebView 透明WebView 保持不透明events-bug、keybindings、window程序化调用OpenDevTools()打开 Inspector 的调用为 no-op此外没有任何示例设置 Liquid Glass 的GroupID或GroupSpacing——这两个选项同样需要该标签否则为 no-op。iOS 与 mobile 示例仅在运行其macOS 桌面变体时需要此标签iOS 与 Android 构建不受影响。小结dev 示例演示了 Wails v3 的 macOS 毛玻璃窗口能力当前仍处于 work in progress 状态透明 WebView 依赖私有 API必须通过-tags private_mac_apis启用mac_private_api_darwin.go 与 mac_public_api_darwin.go 以相同 C 签名提供两套实现公共 Go API 完全一致运行顺序为先npm install npm run build构建前端frontend/package.json再go run -tags private_mac_apis .该标签只影响 macOS对 Windows/Linux/iOS/Android 无效果生产构建如需保留 DevTools需同时使用production,devtools,private_mac_apis。如需深入了解其他示例的用法或私有 API 的完整回退行为可继续阅读 v3/examples/README.md 与 v3/examples/dev/main.go、v3/pkg/application/webview_window_options.go 等源码文件。【免费下载链接】wailsCreate beautiful applications using Go项目地址: https://gitcode.com/gh_mirrors/wa/wails创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →