Widget简介

709 阅读4分钟

一:什么是Widget

Widget 的本质是一个随着时间线而更新的 SwiftUI View。 不是迷你APP,它是一种新的桌面内容展示形式,内容展示什么依产品而定,展示区域不可操作,不可滚动,

如下图:

pasted-image-25.png

二:优秀的Widget需要有三个特点:简单明了、恰当展示、个性化定制

1、简单明了

Widget 不是一个小型的 App,这句话被反复提起。一般用户每天进入主屏幕的次数超过 90 次,但停留的总时长不过几分钟。通常来说用户只会在主屏幕上停留片刻时间,就会跳转到其他地方,所以并不需要任何复杂的交互设计来增强 Widget 的作用,也不需要复杂的样式来丰富 Widget 的内容,简单明了的内容才是 Widget 的关键。

和安卓的 Widget 不太一样,苹果设计的 Widget 并不支持任何复杂交互行为,也不建议大家设计过于复杂的样式来呈现内容,这也非常符合苹果对于主屏幕的改进一直保持克制的特点。

2、恰当展示

智能叠放

在widget中,不仅仅可以在主屏幕上添加小组件,还可以将多个小组件堆叠在一起,并通过轻松滑动,在一个地方提供对各种小组件的访问,系统会根据每个人的习惯,借助端智能的能力,自动的显示准确的 Widget 在最顶部。比如,早上起床,用户最关心天气怎么样,Widget 可以展示一下天气情况;起床后,用户就要了解一下一天的行程,Widget 可以展示一下 Reminders 中的内容;等到一天忙完了,准备睡觉的时候,可以用 Widget 打开音乐稍微放松一下。如下图:  

拼图片113822-日历-31_天气-29.jpeg

特殊场景:Placeholder + SnapShot

Placeholder 当我们浏览主屏幕的小组件时,此时网络条件不好,当加载内容的时候提供了 Placeholder UI API 而不是单调的 loading 加载框来避免过多的白屏的尴尬局面。如下图:  

拼图片114051-pasted-image-33_pasted-image-35.jpeg

SnapShot 当我们长按主屏幕进入编辑状态时,点击屏幕右上角 + 添加小组件,比如我们选择添加天气小组件,提供了 Snapshot 的能力给到开发者可以定制展示样式,smal、medium、large,如下:  

small.jpeg

3、个性化定制

苹果给 Widget 提供了 Configuration 的能力,一共有两种配置类型 StaticConfiguration 也就是用户无需配置,展示的内容只和用户信息有关系 IntentConfiguration 支持用户配置及用户意图的推测功能。

长按主屏幕进入编辑状态,选择天气小组件,这是天气小组件会翻转到背面,给出城市选择的对话框,用户可以根据自己的想要了解的城市,去更改,如下:  

拼图片11429-pasted-image-43_pasted-image-45.jpeg

三:Widget的刷新

Widget 的刷新方式是很特别。在展开讲刷新方式之前,要讲一个概念,叫 Timeline。顾名思义,就是时间线,下面的图就是一条 Timeline。 

image.png

当系统的 WidgetKit 调用 Reload Timeline API 之后,会要求 Widget Extension 的 Timeline Provider 提供一组 TimelineEntry 和 ReloadPolicy,用来后续刷新页面。

首先,Widget 的刷新完全由 WidgetCenter 控制。开发者无法通过任何 API 去主动刷新 Widget 的页面,只能告知 WidgetCenter,Timeline 需要刷新了。

Timeline刷新分为两种方式:系统刷新  &  App请求Widget刷新

  • 系统刷新 行为由系统主动发起,会调用一次 Reload Timeline 向 Widget 请求下一阶段刷新的数据,开发程序时,设定Timeline 在多长时间之后刷新数据

  • APP调用 Widgetcenter 的 API来刷新Timeline

注意:前面所提到的刷新 Timeline 并不是直接刷新 Widget,而是 WidgetCenter 重新向 Widget 请求下一阶段的数据。而 Timeline Provider 就是提供这个数据的对象。

关于Widget刷新来源为如下两部分

  1. TimelineEntry:包含当前日期  &  刷新界面所需要的数据
  2. ReloadPolicy: 刷新策略,一般常用的为:atAfter设置刷新时间间隔
  • atEnd Timeline 执行到最后一个时间片的时候再刷新。
  • atAfter 在某个时间以后有规律的刷新。
  • never 以后不需要刷新了,什么时候需要重新刷新需要 App 重新告知 Widget。

四:唤起主App

Widget 的 UI 是状态的、不可滚动、不支持互动元素(switch等),可通过如下两种方式唤起主App

1、SwiftUI widgetURL API:widgetURL 的点击区域 和 调用方式 如下:  

拼图片11457-pasted-image-51_pasted-image-53.jpeg

2、 SwiftUI Link API:适用于medium 和 lardge  的类型,点击区域 和 调用方式 如下:  

拼图片114449-pasted-image-55_pasted-image-57.jpeg

五:其他

  • Widget只能由SwiftUI开发,一个APP可以对应多个Widget,但是尺寸只有三个smal、medium、large,并且 Widget 不能展示 视频 和 动态图像

  • 同一种 Widget 可以被多次添加到主屏幕中,每个 Widget 都有对应的独立 Timeline,互不干扰,如下图:

image.png