Ember:一款专为无障碍设计打造的原生iOS Hacker News客户端
原标题:Ember, a native iOS Hacker News reader I built around accessibility
速览
本文介绍了开发者Ember打造的一款原生iOS Hacker News客户端。该应用的设计核心围绕无障碍访问(Accessibility)展开,旨在为视障及其他有特殊需求的用户提供流畅的阅读体验。通过原生技术栈实现,Ember在保持高性能的同时,确保了界面元素对辅助技术的完美支持。
AI 深度解读
Ember:一款以无障碍设计为核心的原生 iOS Hacker News 阅读器
背景
在 iOS 生态中,Hacker News (HN) 的官方客户端早已消失,社区长期依赖第三方应用来访问这一技术资讯枢纽。然而,许多现有的 HN 阅读器往往侧重于功能堆砌或简单的网页封装,忽视了原生体验的流畅性以及最关键的无障碍访问(Accessibility)支持。
Ember 是一款由开发者独立构建的原生 iOS 应用,旨在解决上述痛点。它不仅仅是一个新闻聚合器,更是一个关于“如何为所有人构建软件”的实践案例。Ember 基于 SwiftUI 开发,完全摒弃了第三方依赖,将无障碍设计从“事后补救”提升为“核心特性”。该应用旨在提供冷静、快速且包容的阅读体验,特别关注色觉障碍用户、视障用户以及需要动态调整字体的用户群体。
核心内容
Ember 是一款针对 iOS 平台优化的原生 Hacker News 阅读器,其设计哲学是“像原生 iOS 应用应有的样子”。以下是其核心功能与技术实现的详细解读:
1. 原生体验与内容渲染
- 原生评论线程:Ember 不依赖 WebView 渲染 HN 的 HTML 评论。它内置了一个专用的轻量级 HTML 解析器,将 HN 发出的有限标签集(包括
<p>,<i>,<b>,<a>,<pre><code>,<br>及实体字符)转换为原生的NSAttributedString。这意味着评论中的链接可点击、支持斜体、块引用和代码块,且无需加载沉重的网页组件。 - 全量评论树加载:利用 Algolia 的 HN Search API,Ember 能够通过单次请求获取整个评论线程的数据,并将其扁平化为带有深度指示的列表。这使得折叠/展开线程的操作瞬间完成,无需等待后续加载。
- 全 Feed 支持:通过顶部固定的筛选栏,用户可以轻松切换 Top(热门)、New(最新)、Best(最佳)、Ask HN、Show HN 以及 Jobs(招聘)等所有 HN 频道。
2. 智能引导与个性化
- 首次运行设置(Onboarding):Ember 提供了一套简短的首次运行流程。应用会自动读取设备的显示外观(浅色/深色模式)和辅助功能设置,并据此预配置应用。用户可以在实时预览中调整主题、强调色和主页 Feed。
- 自适应检测:在首次启动时,Ember 会检测 VoiceOver、减少动态效果、无颜色区分、粗体文本和大字体等系统设置,自动开启匹配的选项,并明确告知用户做出了哪些更改。
3. 无障碍设计(Accessibility)作为核心特性
Ember 将无障碍视为一等公民,特别是在色觉障碍支持方面做了大量细致工作:
- 非颜色依赖的状态指示:状态信息绝不单独依靠颜色传达。例如,积分和评论计数将 SF Symbol 图标与数值结合;已读状态使用对勾标记;选中状态使用圆环和对勾。
- 色盲友好提示:当系统开启“无颜色区分”(Differentiate Without Color)时,Ember 会自动启用一项设置,在整个应用中添加显式的非颜色指示器。
- VoiceOver 支持:故事行、评论和控制元素都暴露了有意义的标签、提示、特征和自定义操作。每个故事被视为一个连贯的整体元素进行朗读。
- 动态类型(Dynamic Type):排版随系统文本大小缩放,包括评论缩进在内的布局也会在辅助功能尺寸下自适应调整。
- 减少动态效果(Reduce Motion):启用该设置后,动画和加载时的闪烁效果会被最小化。
- 下划线链接:评论中的链接可以显示下划线,确保用户在不依赖颜色的情况下也能识别链接。
4. 其他功能
- 搜索:支持基于相关性或最新时间的全文搜索。
- 稍后阅读:书签功能将故事存储在本地设备中,支持离线访问。
- 阅读追踪:已访问的故事会变暗,方便用户接续阅读。
- 应用内阅读:支持在应用内使用 Safari 视图打开链接(可选阅读器模式),或直接跳转至默认浏览器。
- 用户资料:可查看任何用户的 Karma 值、加入日期、简介及近期提交内容。
- 设计美学:采用温暖的手调色彩系统,支持完整的浅色/深色模式,提供六种强调色主题,并包含触觉反馈(Haptics)和流畅动画。
5. 技术架构
Ember 是一个纯 SwiftUI 项目,无任何第三方依赖,目标平台为 iOS 18。
- UI 框架:SwiftUI。
- 状态管理:使用
Observation框架(@Observable)处理视图模型和存储。 - 并发网络:使用
async/await进行网络请求;Feed 页面使用TaskGroup并发获取,并能容忍个别项目缺失。 - 数据持久化:使用
UserDefaults存储设置和阅读状态;使用 JSON 文件存储书签。 - 数据源:
- Hacker News 官方 Firebase API:用于获取 Feed、项目和用户数据。
- Algolia HN Search API:用于全文评论树(单请求获取)和搜索。
6. 项目结构与构建
项目结构清晰,包含 App、Models、Networking、Stores、DesignSystem、Utilities 和 Features 等模块。
- 构建要求:macOS 需配备 Xcode 16 或更高版本(已在 Xcode 16 / iOS 18 SDK 上构建和测试)。
- 生成项目:使用
xcodegen从project.yml生成 Xcode 项目。brew install xcodegen xcodegen generate open Ember.xcodeproj - 运行:选择
Emberscheme 和 iPhone 模拟器运行,或通过命令行构建。 - 工具:提供 Swift 脚本用于生成应用图标和设备边框截图。
关键要点
- 原生优先:Ember 完全使用 SwiftUI 构建,不依赖 WebView 渲染内容,提供了比传统封装应用更流畅、更原生的交互体验。
- 无障碍即特性:应用从底层设计就考虑了色觉障碍、视障及运动敏感用户,通过图标、形状、下划线等非颜色手段传达状态,并完美适配 VoiceOver 和动态类型。
- 零第三方依赖:作为一个纯 SwiftUI 项目,Ember 没有引入任何外部库,代码轻量且易于维护。
- 智能数据获取:结合 Firebase API 和 Algolia API,实现了单请求获取完整评论树,极大提升了加载速度和交互响应性。
- 本地化存储:书签和阅读状态均存储在本地设备,支持离线访问,保护用户隐私并提升可用性。
- 独立开源:Ember 是独立项目,与 Hacker News 或 Y Combinator 无隶属关系,采用 MIT 许可证发布。
意义与影响
Ember 的出现对 iOS 开发者和无障碍设计领域具有多重启示意义:
- 重新定义“原生”的价值:在 WebView 泛滥的今天,Ember 证明了通过原生解析 HTML 并转换为
NSAttributedString是可行且高效的。这不仅提升了性能,还使得应用能够充分利用 iOS 系统的原生特性(如文本选择、辅助功能集成)。 - 无障碍设计的范式转移:许多应用将无障碍视为合规性检查或事后补丁。Ember 将其作为核心架构的一部分,展示了如何通过非颜色编码、语义化标签和自适应布局,真正服务于残障用户群体。这种设计思路值得所有面向大众的应用借鉴。
- 轻量级架构的可行性:在没有使用复杂第三方框架的情况下,仅依靠 SwiftUI、Observation 框架和原生 API 就能构建出一个功能完整、体验优秀的 RSS/News 阅读器。这为开发者提供了关于如何保持代码库精简、提高可维护性的优秀范例。
- 社区驱动的独立开发精神:作为独立开发者作品,Ember 展示了个人开发者如何通过深入理解
查看原文 →github.com
