← 返回信息流
AI 资讯Hacker News·1 小时前

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. 项目结构与构建

项目结构清晰,包含 AppModelsNetworkingStoresDesignSystemUtilitiesFeatures 等模块。

  • 构建要求:macOS 需配备 Xcode 16 或更高版本(已在 Xcode 16 / iOS 18 SDK 上构建和测试)。
  • 生成项目:使用 xcodegenproject.yml 生成 Xcode 项目。
    brew install xcodegen
    xcodegen generate
    open Ember.xcodeproj
    
  • 运行:选择 Ember scheme 和 iPhone 模拟器运行,或通过命令行构建。
  • 工具:提供 Swift 脚本用于生成应用图标和设备边框截图。

关键要点

  • 原生优先:Ember 完全使用 SwiftUI 构建,不依赖 WebView 渲染内容,提供了比传统封装应用更流畅、更原生的交互体验。
  • 无障碍即特性:应用从底层设计就考虑了色觉障碍、视障及运动敏感用户,通过图标、形状、下划线等非颜色手段传达状态,并完美适配 VoiceOver 和动态类型。
  • 零第三方依赖:作为一个纯 SwiftUI 项目,Ember 没有引入任何外部库,代码轻量且易于维护。
  • 智能数据获取:结合 Firebase API 和 Algolia API,实现了单请求获取完整评论树,极大提升了加载速度和交互响应性。
  • 本地化存储:书签和阅读状态均存储在本地设备,支持离线访问,保护用户隐私并提升可用性。
  • 独立开源:Ember 是独立项目,与 Hacker News 或 Y Combinator 无隶属关系,采用 MIT 许可证发布。

意义与影响

Ember 的出现对 iOS 开发者和无障碍设计领域具有多重启示意义:

  1. 重新定义“原生”的价值:在 WebView 泛滥的今天,Ember 证明了通过原生解析 HTML 并转换为 NSAttributedString 是可行且高效的。这不仅提升了性能,还使得应用能够充分利用 iOS 系统的原生特性(如文本选择、辅助功能集成)。
  2. 无障碍设计的范式转移:许多应用将无障碍视为合规性检查或事后补丁。Ember 将其作为核心架构的一部分,展示了如何通过非颜色编码、语义化标签和自适应布局,真正服务于残障用户群体。这种设计思路值得所有面向大众的应用借鉴。
  3. 轻量级架构的可行性:在没有使用复杂第三方框架的情况下,仅依靠 SwiftUI、Observation 框架和原生 API 就能构建出一个功能完整、体验优秀的 RSS/News 阅读器。这为开发者提供了关于如何保持代码库精简、提高可维护性的优秀范例。
  4. 社区驱动的独立开发精神:作为独立开发者作品,Ember 展示了个人开发者如何通过深入理解
查看原文 →github.com