Ohhnews

分类导航

$ cd ..
foojay原文

苹果不应主导你的应用重设计时间表

#codename one#跨平台开发#xcode 27#后端服务#桌面主题

[LOADING...]

Apple 的设计团队并不知道你的待办清单上有什么。全新的 iOS 外观可能正是你下次发布所需要的;但也可能在客户铺开的中途到来,而此时你恰恰最不想改动导航。

| Codename One 是什么? Codename One 是一个开源框架,让你用单一的 Java 或 Kotlin 代码库构建原生 iOS、Android、桌面和 Web 应用。欢迎访问 codenameone.com 了解更多。|

我们希望支持新 SDK,而不替你做出那个决定。本周,你可以通过重新回归的 ios.xcode_version 提示,在我们的构建服务器上选择 Xcode 27。本地构建和 CI 同样支持 Xcode 27,我们的 iOS 27 主题也获得了更精细的 Liquid Glass 效果。何时采用这种外观,由你决定。Codename One 自行渲染大多数控件,因此主题会随应用一起打包。升级 SDK 时,主题和你应用的 CSS 都可以保持不变。

上周我们介绍了 Xcode 27 所需的构建设置。本周我们将展示动起来的玻璃效果,讲解主题切换,并首次在模拟器中一睹可折叠的 Duo。除 iOS 之外也有大量工作。受 JPA 启发的 ORM 大概是其中最大的一项新增:关系映射和托管会话现在在应用端和后端都可以工作。OpenTelemetry 和 WebSocket 支持让这个后端更接近真实服务所需的能力。

本周即将发布

我们将用六篇后续文章介绍这次发布,附上可直接运行的代码和 UI 变化的截图:

Xcode 选择功能回归

Codeame One 的老用户可能还记得这个提示。在 Settings 应用的 Build Hints 下,你现在可以在云构建服务中选择 Xcode 27:

ios.xcode_version=27

我们曾取消 Xcode 选择功能,因为 Apple 的升级往往同时要求升级 macOS。27 目前尚未有此要求,而虚拟化让我们得以重新提供这一选择。Xcode 26 仍是默认版本。除非你在测试或需要某个新 SDK 特性,否则请保持该提示未设置。 我们会在 beta 之后加入 27.1,并按 Apple 的要求将默认版本迁移到 27。

该提示仅影响云构建。本地构建使用你在 Mac 上选定的 Xcode 安装。主题是另一项独立选择:ios.themeMode=modern 或共享的 nativeTheme=native 选择现代系列,而 ios.themeGeneration=27 选择其 iOS 27 外观。

[LOADING...]

在运行 iOS 27.0 的 iPhone 16 模拟器上,Codename One 480 毫秒标签选择动画的确定性样本。该动画展示的是渲染后的运动效果,而非实时帧率测量。

周六的后续文章将介绍构建与主题设置、精炼的玻璃材质、Health API 变更以及本地 Duo 测试。阅读 iOS 文章。Duo 铰链支持需要本地 Xcode 27.1 beta 构建;云端的 Xcode 27.0 SDK 不包含铰链 API。

我们还移除了 OpenGL ES。Metal 现在是 iOS 的渲染器,旧项目应移除已过时的 ios.metal 提示。移除这条已弃用的路径可以清除编译器警告,并让我们专注于 Metal 上的渲染工作。参见 PR #5875。

受 JPA 启发的 ORM

上周的后端教程使用了显式外键字段和即时 DAO 写入。新的托管 ORM 增加了关系和一个能在同一次工作单元中追踪相关对象的会话。同一套映射注解既适用于客户端 SQLite,也适用于后端数据库。

Session session = entities.openSession();
try {
    session.beginTransaction();
    Customer customer = session.find(Customer.class, customerId);
    if (customer != null) {
        customer.name = "Updated name";
    }
    session.commitTransaction();
} finally {
    session.close();
}

这里 entities 是一个 EntityManager,Customer 是一个映射实体,customerId 标识该行。会话会检测变更的字段,并在 flush 时写入。关闭会话绝不会提交未完成的工作。

关系、延迟加载、版本检查,以及受支持的 JPQL 子集,使得这次改动远不止另一个查询便捷方法。它们也引入了一个教程必须解释的选择:关系由哪一端拥有、查询在何时加载它,以及会话关闭后会发生什么。周日的文章会逐一讲解这些选择。这是一个受 JPA 启发的 API,拥有自己的包和文档化的限制,而不是宣称与 JPA 完全兼容。参见 PR #5885。

OpenTelemetry 支持

一个缓慢的界面可能是在等网络、等某个服务,或等某一条数据库查询。仅靠服务器日志,无法展示用户的时间花在了哪里。

我们新的 OpenTelemetry 集成将应用的网络请求与后端请求和数据库 span 关联起来。一个 span 记录一次操作;相关的 span 构成一条 trace。一个注解即可启用埋点,span 通过标准的 OTLP 传输到达 collector。

flowchart TD
    Tap[App action span] --> Request[ConnectionRequest span]
    Request -->|traceparent| Server[Backend request span]
    Server --> SQL[Database statement span]
    Server --> Service[Outbound service span]
    Tap -. app export via relay .-> Collector[OTel collector]
    Server -. backend export .-> Collector
    Collector --> View[Your tracing system]

这对在大型组织中引入小型服务的团队很有用。新服务可以接入运维团队已在使用的追踪系统,无需自建一套孤立的诊断 UI。周一的文章将介绍 collector 配置、采样、应用中继,以及 PR #5887 中的确切埋点边界。

WebSocket 支持

你的后端现在可以保持连接打开,并在数据变化时主动推送。实时状态界面、聊天和进度更新都可以使用 WebSocket,而不必反复轮询某个 HTTP 端点。用 @WebSocketMapping 注册一个 Java 端点,然后通过后端 API 处理文本和二进制消息。

我们在设备测试中接收截图时也用了同一套实现。元数据以文本形式到达,图像以二进制形式到达,服务器在设备继续之前确认已保存的图像。这让公共 API 在我们的 CI 中有了一份常规负载:一条丢失的消息就可能中断我们依赖的测试运行。

周二的文章包含一个完整的端点,并解释连接限制、超时,以及慢速客户端如何影响发送。它还会追踪来自 PR #5880 的截图接收器,包括仍使用旧服务器的传统 Windows 测试路径。

推送投递回调

云端接受了推送请求,并不意味着服务商接受了每一个目标。投递反馈会以带签名的每日摘要形式,将后续结果交给你的后端。这是一项 Pro 及以上级别的组织级设置。

值得自动化的决策其实很狭窄:在 INVALID_TARGET 之后移除密钥。临时的服务商故障可能在密钥依然有效的情况下耗尽重试预算。周三的文章展示如何验证摘要、按 deliveryId 去重,并仅在数据库写入提交后发送确认。PR #5890 中的示例覆盖了 CN1 后端、Spring、MicroProfile 以及 Node/serverless JavaScript。

生产级原生桌面主题

上周的原生桌面主题还只是一个实验。本次发布将它们带入生产使用,精炼了控件,加入浅色与深色外观,并将桌面窗口行为集成进主题。你的应用可以在 Windows 上选择 Fluent、在 macOS 上选择 Aqua、在 Linux 上选择 Adwaita,同时保留自己的品牌形象。

我们已在 Codename One Settings 工具中采用了它们。它的表单和对话框帮助我们找出并修复了那些孤立组件截图所遗漏的细节。

[LOADING...]

在 macOS 上截取的采用 Aqua 主题的 Settings 工具。周四的文章将涵盖全部三个主题系列的浅色与深色外观。

这项改动不仅触及控件,也触及窗口。桌面原生主题会在真实的操作系统窗口中打开普通对话框。打包的 JavaSE 应用默认使用原生标题栏并支持全部三个主题;模拟器则可以使用主题所声明的标题栏样式。现有项目仍然可以选择是否采用这些主题。PR #5886 展示了那些暴露并帮助完善默认值的应用工作。

缩短从文档到运行设备的路程

两项较小的改动让其余部分更易于探究。

生成的 agent skill 现在会解释原生设备调试器和 MCP 工作流。Agent 可以通过语义化 UI 工具检查和操作运行中的应用,而调试器负责断点和堆栈检查。对于仅用 MCP 的 iOS 会话,ios.onDeviceDebug.waitForAttach 必须为 false:否则应用会在 start() 之前等待,永远不打开其 MCP 监听器。实体 iPhone 还需要一个 USB 中继来访问该 loopback 端口。设备端参考文档 收录了来自 PR #5864 的命令和平台限制。

开发者指南现在提供了带站点搜索、导航和各个章节链接的章节页面。单页版本依然可用。在上周的 Javadoc 工作之后,指南链接可以带你跳转到相关章节,而不再是把丢进整本书里。两种视图都来自同一份 AsciiDoc 源文件。PR #5860 包含了生成器和兼容性路由。## 把下一个版本纳入你的日程

支持 Xcode 27 是我们的职责。决定你的应用何时改换外观,由你说了算。主题设置让你把这些决定分开处理,无论你是在 iOS 上试用 Liquid Glass,还是在为一款最初诞生于手机端的应用采用桌面主题。

即使你完全不碰 UI,这里也有不少可用的东西。用于编辑关联记录的界面可以使用托管 ORM 会话。状态界面可以接收 WebSocket 更新。当请求变慢时,OpenTelemetry 可以指出哪个服务或查询需要关注。你可以把这些改动直接用到已经排在待办清单里的功能上。

明天我们将从 iOS 改动开始,包括选择主题的代码和 Duo 模拟器捕获。然后,我们会用本周剩余时间详细讲解数据、服务和桌面功能。
分享此页面

发现错误,或者想补充内容?在 GitHub 上编辑此页面

[LOADING...]
作者:

Shai Almog

作者、DevRel、博主、开源黑客、Java 摇滚明星、会议演讲者、讲师和企业家。

加入讨论