Codename One 7.0.250 发布:原生Mac应用支持与桌面集成
Codename One 长期以来一直通过 JavaSE 目标在桌面上运行,该目标与模拟器使用相同的引擎。它所缺少的是一个真正的原生 Mac 二进制文件,而且桌面输出仍然带有许多手机形态的习惯:在操作系统菜单栏的位置绘制了一个工具栏、无法抓取的滚动条、菜单中没有“偏好设置”或“退出”项。从 7.0.250 版本开始,我们终于拥有了一个实际的原生 macOS 应用目标,它不捆绑 JVM,并且与我们的 iOS 目标一样原生。
源自 iOS 管线的原生 Mac 构建
PR #5053 新增了一个 Mac Native 目标,该目标将现有项目通过与 iPhone 构建器和生成 iOS 应用的 ParparVM 管线相同的构建流程进行处理。在这种情况下,它会生成一个原生 Mac 变体。
我们可以在 IntelliJ 的标准 Maven 菜单中找到这些目标,作为 "Mac Native Build" 来发送云端构建:
视频 10 音频 5 音频 6 访问广告商网站 GO TO PAGE
[LOADING...]
或者作为 "Mac Native Project" 来生成 Xcode 项目:
[LOADING...]
这些目标应该以与等效 iOS 目标相同的方式工作。得益于我们切换到 Metal,原生 Mac 构建的代码非常相似。这意味着 Mac 原生目标的代码大部分已经过战斗测试。我们使用了 Mac Catalyst,这是 Apple 的一个 iOS/Mac 移植框架。面向用户的名称是 "Mac native",未来的阶段可能会添加一个共享同一 Metal 渲染器的 AppKit 目标,而无需更改你构建时所面向的表面。
需要注意的是,iOS 原生接口对于桌面目标来说是相同的;这可能正常工作,但如果没有,你可以使用 #ifdef 来为 Mac 目标适配代码。下面是一个在原生 Mac 应用上运行的 Codename One 示例,它使用与生成 iOS 和 Android 构建相同的 Java 代码(它使用了本周晚些时候将介绍的新广告 API):
[LOADING...]
证书
Mac 目标存在一个主要差距:签名。目前,我们的证书向导、设置等都面向 iOS/Android。Mac 使用不同的存储和签名工具。我们尚未更新所有这些基础设施,可能需要一些时间来更新。作为短期解决方案,我们支持一些构建提示来配置此行为:
桌面集成
PR #5136 和后续的 PR #5170 使桌面目标的行为像桌面应用,而不是窗口中的平板应用。所有这些都是可选的,对于新生成的应用默认开启,在移动设备上或禁用时完全无效。它涉及核心以及桌面端口、JavaSE、Mac 和未来的端口。
窗口边框和操作系统标题栏
一个新的构建提示用于选择窗口的框架方式:desktop.titleBar=native
在 native 模式下,Codename One 的 Toolbar 被抑制,表单标题被放置到操作系统标题栏中,你的命令被桥接到一个真正的原生菜单栏(在 JavaSE 上是一个 Swing JMenuBar,它在 macOS 上成为屏幕菜单;在 Mac Catalyst 上是一个 UIMenuBuilder 菜单)。custom 模式为你提供一个无装饰的窗口,带有 Codename One 绘制的标题按钮和窗口拖动;toolbar 模式保持传统行为。这些模式共同让你以高度自定义的方式控制应用的外观。
命令进入正确的菜单
命令不再全部堆积到一个合成菜单中,而是可以声明它属于何处:
setDesktopMenu(...) 接受 DESKTOP_MENU_APP、ABOUT、PREFERENCES、QUIT、FILE、EDIT、VIEW、WINDOW、HELP 或自定义的顶层标题字符串,因此 Preferences 和 Quit 会出现在 Mac 用户期望的位置。setDesktopShortcut(...) 附加一个键盘加速键;DESKTOP_SHORTCUT_MODIFIER_PRIMARY 在 macOS 上是 Command,在其他平台上是 Control,因此相同的代码在每个桌面上都能正常工作。加速键会同时显示在菜单项旁边并从键盘触发。
交互式滚动条
桌面滚动条现在支持拖拽式抓取、点击轨道翻页以及始终可见的轨道,遵循 macOS 和 Material 的惯例。滚动条拇指在指针悬停时显示悬停样式,拖拽时显示按下样式,并且最小拇指大小确保在非常长的内容上也能抓取。这由 interactiveScrollBool 主题常量控制,并使用专用的 Desktop* UIID,因此移动端样式不受影响。
桌面通知
PR #5170 使标准的 LocalNotification API 在真实桌面构建上工作,而不仅仅是在模拟器中。在 JavaSE 上,计划的通知通过一个持久系统托盘图标作为原生操作系统通知呈现,点击它会分派到你的 LocalNotificationCallback,路径与移动端相同。Mac Catalyst 继续使用 iOS 通知路径。你为移动端编写的相同通知代码现在也可以在桌面上运行。
生成的应用默认获得这些特性
来自原型和 Initializr 的新项目默认使用 desktop.titleBar=native,并启用了交互式滚动条,现代主题在亮色和暗色模式下均提供 Desktop* 和 Window* UIID(ios-modern 中遵循 macOS 惯例,android-material 中遵循 Material 惯例)。如果你有现有应用,请使用上述两个提示选择加入,并对照你的主题检查新的 UIID。
这在两个桌面构建上都经过了端到端验证:JavaSE fat jar 和 Mac Catalyst .app 都通过同一个 AppleScript 机器人测试进行驱动,测试了窗口标题、菜单位置以及原生菜单命令触发。开发者指南中的完整桌面集成章节涵盖了详细信息。
发布文章 提供了完整的本周索引。明天的深入探讨将涵盖核心中的 WebSockets、gRPC 和 GraphQL,同样主题是赋予 Codename One 应用更好的与外界通信方式。