“每日一词”小组件听起来很简单:选一个词,显示出来,明天再换一个。但对一分钟俄语学习应用 Slovo 来说,这远远不够。它的核心产品逻辑是:用户瞥一眼屏幕,就应该触发一次主动回忆。如果小组件只展示当天的新词,学习者一旦认出这个词,它就没用了。Slovo 想要的是把新词曝光和间隔复习混在一起。

最终呈现在主屏幕上的效果很简洁,但背后涉及数据共享、时间线生成、渲染模式、回退行为和扩展打包等一系列决策。这篇文章拆解的是实现路径,而不是产品口号。

打开网易新闻 查看精彩图片

应用与小组件扩展之间的数据边界

iOS 小组件并不是主应用里运行的一个小视图。它是一个独立的扩展,有自己的进程和生命周期。这意味着主应用的 AppModel 不能直接把内存中的复习队列交给小组件。Slovo 在两者之间建立了一个刻意收窄的数据接口。

小组件不需要整个学习数据库,它只需要当前优先词和一小串有序的复习候选词。这样既让扩展保持轻量,也避免了在两个目标中重复实现调度逻辑。

构建 24 小时时间线

WidgetKit 要求提供者生成时间线条目。Slovo 为接下来的 24 小时每小时创建一个条目。序列从每日词开始,再加入最多五个复习词。每个后续时段从循环中选取:每日词会被过滤出复习轮换,避免同一个词重复出现;第零个时段优先使用应用最近选择的词,这样小组件刷新后能立即反映学习者当前上下文

如果新用户还没有复习队列,提供者会使用最近几天的词作为回退材料。空状态会浪费小组件最重要的时刻——用户添加它的第一天。

一个视图,五种小组件尺寸

Slovo 的小组件支持五种尺寸:系统小尺寸、系统中尺寸、内联配件、圆形配件和矩形配件。锁屏配件不能简单缩小主屏幕卡片,每种尺寸的信息预算都不同。内联版本组合了重音词和释义;圆形版本显示图标和首字母;矩形版本有足够空间容纳重音词、音标和释义。主屏幕尺寸保留了 Slovo 的编辑层级:顶部是级别和状态,中间是大号衬线俄语词,下方是释义和发音。

着色小组件的问题

第一版全彩设计使用了固定墨色和纸张色。当用户开启着色模式后,小组件背景会被系统替换,固定颜色在深色或彩色背景下可能失去对比度。Slovo 的解决方式是让关键文字使用系统提供的语义颜色,而不是硬编码色值。这样在浅色、深色和着色模式下都能保持可读性。

这个调整看起来很小,但它直接影响用户是否愿意把小组件长期留在主屏幕上。一个在着色模式下看不清字的小组件,很快就会被移除。

扩展打包与回退逻辑

小组件扩展需要单独打包,主应用和扩展共享同一个 App Group 容器。Slovo 在扩展里没有复制完整的调度代码,而是只读取主应用写入的状态。如果共享容器里没有有效数据,扩展会显示一组预设的俄语基础词,而不是空白。这个回退路径保证了小组件在首次安装后立即有内容可展示。

整个实现的核心思路是:把复杂逻辑留在主应用,把小组件扩展做成一个轻量渲染器。数据接口窄而明确,时间线生成规则简单可预测,回退行为覆盖新用户和异常状态。最终用户看到的只是一个每天变化的俄语词卡片,但每一次瞥见都被设计成一次记忆提取练习。