当应用不再属于特定操作系统 -- 肘子的 Swift 周报 #159
发布时间:2026/10/28 10:22:12 锦皓数字建站

当应用不再属于特定操作系统本期周报中有三个颇有意思的项目Cutefish、SimRun 和 Mac Android Subsystem。它们采用了不同的技术路线有的通过兼容 API 和框架来提供运行环境有的直接运行针对模拟器构建的应用还有的将完整的虚拟系统隐藏在后台。但它们都在尝试做同一件事让原本属于不同操作系统的应用能够自然地出现在同一张桌面上。跨平台运行当然不是什么新鲜事。从 Wine 到各种虚拟机、模拟器开发者已经为此努力了几十年。不过开发者不再仅仅满足于让应用「能够运行」而是希望用户不必在意应用原本属于哪个平台。独立窗口、Dock、Spotlight、剪贴板、系统通知……当这些能力逐渐融合运行环境便开始退居幕后应用与宿主系统之间的边界也随之变得模糊。AI 也正在加快这一进程。过去无论是逆向分析系统 API、复刻框架行为还是移植复杂的应用运行环境都需要投入大量时间和人力。如今Coding Agent 可以承担其中相当一部分探索、实现与验证工作让个人开发者和小团队也有机会尝试过去难以负担的项目打破这些边界的成本正在下降。一个问题也逐渐呈现如果应用不再那么依赖特定的操作系统我们未来会如何选择硬件过去一款独占应用、一个不可替代的软件生态可能就足以决定用户购买哪台设备。而当越来越多的应用可以跨越系统边界硬件本身的设计、性能、价格、系统体验甚至品牌忠诚度和个人喜好或许会在购买决策中占据更大的分量。有趣的是这未必意味着平台之间的竞争会减弱。恰恰相反谁能让来自不同生态的应用更自然、更稳定地融入自己的系统谁就可能拥有新的吸引力。竞争的重点或许会逐渐从「我独占哪些应用」转向「我能为这些应用提供怎样的使用体验」。也许未来选择一台设备时我们不必首先考虑它能运行哪些应用而是可以更多地考虑我们究竟喜欢怎样使用它。本期内容 | 前一期内容 | 全部周报列表近期推荐在 Linux 上运行原生 Mac 应用 (Running Mac apps on Cutefish)在 Linux 上运行 Windows 应用已经稀松平常但让未经修改的 macOS 应用直接运行在 Linux 上听起来则有些不可思议。Cutefish 正在尝试实现这一目标。它没有采用虚拟机或指令模拟而是通过一套名为 Reef 的兼容层重新实现 Mach-O 加载器、Objective-C Runtime以及 Foundation、AppKit、Core Graphics、SwiftUI 等框架让 Mac 应用能够直接在 Linux 桌面环境中运行。本文不仅展示了当前的兼容成果还坦诚讨论了性能问题例如局部状态变化时重建整棵视图树以及滚动过程中的重复绘制。Swift 正在不断拓展其跨平台能力但大量使用 Swift 开发的应用仍然深度依赖苹果生态中的各类框架难以直接移植到其他平台。Reef 则提供了另一种可能不改变现有应用而是让其他平台具备运行这些应用的能力。iOS 触觉反馈完整指南 (Every iOS Haptic Pattern, With Code)iOS 提供了多种触觉反馈 API但不同机制之间的能力与适用场景并不完全相同。Alok Singh 汇总了 UIKit 的 Feedback Generator、SwiftUI 的.sensoryFeedback以及 Core Haptics 的使用方式并提供了涵盖系统预设反馈、自定义触觉模式、动态参数和 AHAP 文件的代码示例。由于触觉反馈无法通过模拟器体验Alok 还开发了 Haptics Explorer让开发者能够直接在 iPhone 上比较不同触觉模式并获取相应的 Swift 代码。AVFoundation 音频闪避与平滑混音工程实践在背景音乐与语音旁白需要同时播放的场景中如果只是在语音开始和结束时直接调整背景音乐音量很容易出现突兀的音量变化甚至在语音自然停顿时产生反复起伏的「抽吸效应」。Snow Wu 介绍了如何通过非对称音量渐变让背景音乐快速降低、缓慢恢复并利用 Generation Token 与延迟窗口避免语音自然停顿引起的频繁音量变化。相较于代码本文给出的设计思路更值得借鉴音频状态变化需要符合人的听觉感知而异步事件需要经过协调才能转换成稳定的播放状态。被拆掉的 NSHostingView 还会再建一次 View在 SwiftUI 与 AppKit 混合开发中NSViewRepresentable的dismantleNSView已经被调用是否意味着内部的视图不会再被创建王巍Onevcat 发现了一个反直觉的现象外层 Representable 已经进入拆除流程嵌套其中的NSHostingView却仍然可能在后续布局事务中重新调用子视图的makeNSView导致原本已经转移到 Canvas 的终端 Surface 被一个不可见的宿主重新夺走。文章完整记录了从版本二分、发现.overlay角标与问题复现的隐蔽关联到构建最小复现并确认嵌套 Hosting View 生命周期问题的过程。最终作者不仅在dismantleNSView中主动移除内部的NSHostingView还改进了共享 Surface 的所有权规则使其能够从不再显示的宿主中恢复。本文的另一层价值在于它展示了 AI Agent 在复杂调试任务中的一种有效使用方式。Agent 不只是修改代码而是通过反复实验建立证据链开发者则在关键节点追问原因避免在症状消失后过早结束调查。一套工具契约接入多种实时语音模型 (How I built Live Voice: one tool contract, six realtime voice providers)在应用中接入实时语音 AI难点不仅在于处理音频流和模型响应还在于如何让模型安全、可靠地操作应用。Apoorv Darshan 分享了他为开源应用 Fud AIiOS 端基于 SwiftUIAndroid 端基于 Compose开发 Live Voice 功能的实践通过统一的 JSON 工具契约定义 25 种应用操作让 iOS、Android 和 Cloudflare Worker 遵循相同的接口并使用独立的 Adapter 处理 Gemini Live、OpenAI Realtime、xAI 和 Qwen 等服务在音频格式、工具调用和视觉输入方面的差异。Apoorv 将工具分为读取、导航、写入和破坏性操作写入后提供 8 秒撤销窗口破坏性操作则必须经过用户确认默认设置下普通写入同样需要确认。当开发工具不再围绕编辑器 (Why Tuist should build the harness on top of compute)几个月前Tuist 联合创始人 Pedro Piñera 还在 The remote development mirage 中对全面转向远程开发的趋势持保留态度。但随着对 Amp 的深入使用他开始重新审视这一判断。当 Coding Agent 可以独立完成越来越多的编码任务开发者或许不再需要始终坐在电脑前面对编辑器完成工作。移动设备、语音交互甚至 Live Activities都可能成为新的开发入口。在本文中Pedro 提出随着 Compute 逐渐商品化Tuist 应该将差异化竞争力建立在 Compute 之上的 Coding Harness 与开发体验中。他此前在 The automation graph agents need 中讨论过如何让 Agent 根据代码变更确定后续的测试与验证任务而如今他希望将这些能力与远程计算资源结合让开发工具从被动执行命令转向主动理解项目、组织任务并验证结果。当代码编辑不再是开发活动的中心我们需要的究竟是一款更智能的 IDE还是一种全新的开发工作环境还没开始对话Claude Code 就占用了 39.6k TokenClaude Code 的上下文开销究竟来自哪里通过/context all指令可以查看尚未输入任何提示词时的初始上下文占用。除了系统提示词和工具定义CLAUDE.md、Rules、Skills 和自定义 Agents 也可能占据相当大的比例而采用延迟加载的 MCP 工具并不计入初始占用。Hao Liu 介绍了如何利用/skill-doctor和/doctor prompt-audit检查不常使用的 Skills、重复规则及过时指令并提出按文件路径加载规则、精简CLAUDE.md等优化方法。作者也提醒读者上下文占用并不等于每轮请求的实际费用Prompt Caching 能够降低重复内容的计费成本与其凭印象精简配置不如先测量自己的环境再决定哪些内容真正值得清理。工具SimRun让 iOS 应用在独立的 Mac 窗口中运行由 Cyandev 开发的 SimRun 是一个颇有意思的开源实验项目无需启动完整的模拟设备也无需为应用增加 Mac Catalyst 适配使用者可以直接在 macOS 上以独立窗口运行 Xcode 为 iOS 模拟器编译的应用。对于需要反复调整 SwiftUI、UIKit 界面的开发者这提供了另一种开发辅助方式。项目还提供命令行、截图、视图层级检查以及实验性的 JavaScript 自动化接口并支持在不显示窗口的情况下运行应用方便编写检查脚本或让 AI 编程代理操作应用。需要注意SimRun 依赖 Apple 芯片 Mac、Xcode 与模拟器运行时并要求关闭系统完整性保护SIP。Mac Android Subsystem让 Android 应用融入 Mac 桌面与上面的项目有些神似由 Harkhowalia 开发的 Mac Android SubsystemMAS尝试让 Android 应用拥有接近 Mac 应用的使用方式双击 APK 即可安装每个应用都有独立窗口和 Dock 图标能够通过 Spotlight 搜索、使用 ⌘-Tab 切换还支持通知中心和双向剪贴板。MAS 并不是直接运行 Android 应用而是基于 LineageOS、QEMU 和 Apple Hypervisor Framework在后台运行完整的 Android 环境再通过 scrcpy 将应用画面呈现到独立的 Mac 窗口中。目前项目仍处于早期预发布阶段要求 Apple Silicon Mac 和 macOS 15 或更新版本不包含 Google Play 商店及 Google 服务。往期内容谁是 AI-relay App 的真正威胁 - #158当 Build in Public 重新转入地下 - #157Swift Server又多了一个 Google - #156iPhone Duo 留给开发者的一个月 - #155 支持与反馈如果本期周报对你有帮助请点赞- 让更多开发者看到评论- 分享你的看法或问题转发- 帮助同行共同成长拓展 Swift 视野 邮件订阅| weekly.fatbobman.com 获取独家技术洞察 开发者社区| Discord 实时交流开发经验 原创教程| fatbobman.com 学习 Swift/SwiftUI 最佳实践
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。