共计 6433 个字符,预计需要花费 17 分钟才能阅读完成。
0x00 前言
2020 年 6 月 22 日,苹果召开了第一次线上的开发者大会 – WWDC20。这堪称是一次能够载入史册的发布会,发表了 ARM 架构 Mac 芯片、软硬件的生态大对立、iOS 14 零碎界面大改等一系列激动人心的音讯。
当然,最让我感兴趣的就是让 iOS 界面大改的 Widget 了。过来几年,iOS 的桌面交互体验堪称是一言难尽,Widget 的退出无疑是一次比拟大的破局。在看发布会的时候,我的脑海里就浮现出一个问题:“这会是下一个互联网公司竞争的流量入口吗?”
先不抛论断,让咱们先看一下 WWDC20 介绍了哪些对于 Widget 的新货色。
(WWDC 2020 精彩内容思否专栏:https://segmentfault.com/blog…
本篇内容来自于阿里巴巴淘系技术部,高级无线开发工程师柘剑。
更多精彩内容可关注【淘系技术】公众号。)
0x01 什么是 Widget?
Widget 不是一个小型的 App,它是一种新的桌面内容展示模式,次要是用于补救主应用程序无奈及时展现用户所关怀的数据。如下图所示:
一个优良的 Widget 须要有三个特点:简单明了 (Glanceable)、 失当展现(Relevant)、个性化定制(Personalized)
简单明了(Glanceable)
Widget 不是一个小型的 App,这句话被重复提起。个别用户每天进入主屏幕的次数超过 90 次,但停留的总时长不过几分钟。通常来说用户只会在主屏幕上停留片刻工夫,就会跳转到其余中央,所以并不需要任何简单的交互设计来加强 Widget 的作用,也不须要简单的款式来丰盛 Widget 的内容,简单明了的内容才是 Widget 的要害。
和安卓的 Widget 不太一样,苹果设计的 Widget 并不反对任何交互行为,也不倡议大家设计过于简单的款式来出现内容,这也十分合乎苹果对于主屏幕的改良始终放弃克服的特点。
失当展现(Relevant)
苹果冀望 Widget 能够和正在执行或者思考的事件严密的联合。比方,早上起床,用户最关怀天气怎么样,Widget 能够展现一下天气情况;起床后,用户就要理解一下一天的行程,Widget 能够展现一下 Reminders 中的内容;等到一天忙完了,筹备睡觉的时候,能够用 Widget 关上音乐略微放松一下。为此,苹果零碎提供了一个叫智能叠放(Smart Stacks)的性能,智能叠放是一个 Widgets 的汇合。零碎会依据每个人的习惯,借助端智能的能力,主动的显示精确的 Widget 在最顶部。
当然,苹果也思考到了一些非凡的场景,比方 Widget Gallery 浏览时,提供了 Snapshot 的能力给到开发者能够定制展现款式,当加载内容的时候提供了 Placeholder UI API 而不是枯燥的 loading 加载框来防止过多的白屏的难堪场面。这些设计的目标只有一个,苹果冀望 Widget 能够在任何特定的场景都能够展现正当的款式。
个性化定制(Personalized)
Widget 须要肯定的定制能力,比方当我增加一个天气 Widget,我只须要关怀杭州的天气怎么样。为了实现这个能力,苹果给 Widget 提供了 Configuration 的能力。顾名思义,就是可配置。一共有两种配置类型:
- StaticConfiguration,也就是用户无需配置,展现的内容只和用户信息有关系。
- IntentConfiguration,反对用户配置及用户用意的揣测性能。
IntentConfiguration 的实现是基于 Intents.framework,开发过 SiriKit 和 Shortcuts 肯定晓得 Intents API 是用于理解用户用意的。其实就是一个智能的表单零碎,开发者创立一个 SiriKit Intent Definition File 之后,只须要简略的配置,Xcode 会主动帮你生成对应的代码和类型。
当开发者编写完配置之后,会借助 Intents.framework 的能力,在运行的时候间接绘制出一个配置页面(如下图所示),开发者并不需要关怀如果编写这个页面。
0x02 Widget 的刷新形式
Widget 的刷新形式是很特地的,相当的克服。在开展讲刷新形式之前,要讲一个概念,叫 Timeline。顾名思义,就是工夫线,上面的图就是一条 Timeline。
当零碎的 WidgetKit 调用 Reload Timeline API 之后,会要求 Widget Extension 的 Timeline Provider 提供一组 TimelineEntry 和 ReloadPolicy,用来后续刷新页面。
这里的概念比拟多,咱们一个一个来解释。
首先,Widget 的刷新齐全由 WidgetCenter 管制。开发者无奈通过任何 API 去被动刷新 Widget 的页面,只能告知 WidgetCenter,Timeline 须要刷新了。
零碎提供了两种形式来驱动 Timeline 的 Reload。System Reloads 和 App-Driven Reloads。
System Reloads: 这个行为由零碎被动发动,会调用一次 Reload Timeline 向 Widget 申请下一阶段刷新的数据。零碎除了会按时发动 System Reloads 之外,还会借助端智能的能力,动静决策每个不同的 TimeLine 的 System Reloads 的频次。例如被查看次数很大水平上间接决定了 System Reloads 的频率。当然还有一些因为设施环境变动触发的行为也会触发 System Reloads,比方设施工夫进行了变更。
App-Driven Reloads:指的是 App 申请 Widget 下一阶段刷新的数据。这里也要分两种场景,利用在前台运行和利用在后盾运行。当利用在前台运行的时候,App 能够间接申请 WidgetCenter 的 API 来触发 Reload Timeline;而当利用处于后盾时,后盾推送(Background Notification)也能够触发 Reload Timeline。
留神,后面所提到的 Reload Timeline 并不是间接刷新 Widget,而是 WidgetCenter 从新向 Widget 申请下一阶段的数据。而 Timeline Provider 就是提供这个数据的对象。
而 Timeline Provider 提供的数据有两局部,一部分是 TimelineEntry,另外一部分是 ReloadPolicy。
TimelineEntry 是某个工夫节点下 Widget 须要出现的视图信息和工夫点。
而 ReloadPolicy 则是接下来这段时间 Timeline 的刷新策略,一共有三种:
- atEnd: 是指 Timeline 执行到最初一个工夫片的时候再刷新。
- atAfter: 是指在某个工夫当前有法则的刷新。
- never:是指当前不须要刷新了。什么时候须要从新刷新须要 App 从新告知 Widget。
当 Timeline Provider 提供完下一阶段的数据之后,就会进行运行。零碎也会依据 entry 的信息,到点对 Widget 的展现内容进行刷新。值得一提的是,WidgetKit 会把 Timelines 所定义的 Entries 对应的 Views 构造信息缓存到磁盘,而后在刷新的时候才通过 JIT 的形式来渲染。这使得零碎能够在极低电量开销下为泛滥 Widgets 解决 Timelines 信息。
简而言之,苹果对 Widget 的刷新相当的克服。开发者无奈间接决定 Widget 刷新,只能提供刷新策略。具体的工夫和节奏全副由零碎来管制。苹果这么做,大概率是为了进步主屏幕的性能和缩小电量开销上的思考。
0x03 Widget 和 SwiftUI
Widget 只能用 SwiftUI 来进行开发,确切的说,Widget 的实质是一个随着工夫线而更新的 SwiftUI 视图。
当我最开始晓得这个限度的时候,说实话是相当震惊的。家喻户晓,SwiftUI 是一个去年才公布的新技术,而且最开始的时候 SwiftUI 是相当不稳固的,以至于苹果本人都是倡议开发者临时不要用到生产环境上,Widget 作为零碎主屏幕的性能,强制应用这么新的技术,会不会太激进了?
显然是不会。苹果要求 Widget 只能应用 SwiftUI 次要是基于几点思考:
- SwiftUI 通过一年的倒退,有了很大的晋升,不仅能够应用 SwiftUI 来构建整个应用程序,而且在一些方面曾经优于基于 UIKit 的开发方式了。具体的内容,大家能够看一下《详解 WWDC 20 SwiftUI 的重大扭转及外围劣势》
- 苹果正在布局 跨平台,大对立 的策略。Widget 作为零碎的外围性能,应用 SwiftUI 是惟一的抉择。SwiftUI 精美的 DSL 设计,使得开发者应用一套代码在 iOS、iPadOS、macOS、watchOS 和 tvOS 等多个平台展现不同的款式能够轻松的实现。(Widget 只会在 iOS、iPadOS 以及 macOS 上展现)
- 应用了 SwiftUI 使得 Dynamic Type 和 Dark Mode 等问题适配起来老本很低。
- 只有应用 SwiftUI 能力达到很多对于 Widget 的限度。假使能够应用 UIKit 开发者可能有无数种方法绕过苹果的限度。比方开发无奈应用 UIViewRepresentable 来桥接 UIKit,只有应用任何 UIKit 的元素会间接 Crash。
- 将 Swift 语言和 SwiftUI 的重要水平晋升了一大截。
0x04 Widget 的展现模式
一个 App 能够对应多个 Widget Extension
你能够应用 WidgetBundle 来进行组装。苹果并没有对 Widget Extension 有数量上的限度。所以为了防止大家开发过多的 Widget Extension 导致搜寻起来麻烦,在 Widget Gallery 中只能看到一个条目。
一个 Widget Extension 一共只有三种尺寸。
思考到简单明了的特点以及手机屏幕的空间无限的问题。苹果只提供了三种款式能够抉择,systemSmall(2 * 2 icon 区域)、systemMedium(2*4 icon 区域)、systemLarge(4 * 4 icon 区域)
同一种 Widget 能够被屡次增加到主屏幕中
而且对于每一个 Widget 来说,都有其对应的独立 TimeLine,互相独立,互不烦扰。
开发者无奈开发智能叠放(Smart Stacks)
开发者无奈开发一个 Widget 的汇合。智能叠放(Smart Stacks)是一个零碎特有的能力,对于开发者来说,惟一能够做的就是被动提供相关性信息。前文提到了 Timeline 的数据又一组 TimelineEntry 组成,而每个 TimelineEntry 除了蕴含工夫点和视图信息以外,还能够蕴含一个 TimelineEntryRelevance 对象,用来示意这个 entry 的相关性。
不可交互,只可点击
Widget 的 UI 是无状态的,不反对滚动,也不反对像 Switch 一样的互动元素。惟一凋谢的能力只有通过点击和 DeepLink 来唤起主 App。
苹果提供了两种 API 给到开发者,第一种是 SwiftUI widgetURL API),代码如下所示:
而 widgetURL 的可点击区域如下:
对于 systemSmall 类型来说,只反对 widgetURL 的形式,然而 systemMedium 和 systemLarge 还能够应用 SwiftUI Link API,代码如下所示:
而 Link 的可点击区域如下:
同时,为了性能和耗电量的思考。Widget 不能展现视频和动静图像。所以期待通过动效吸引用户眼球的形式能够临时息熄火了~
0x03 总结与瞻望
Widget 的呈现,让 iOS 零碎的桌面有了破局,肯定会有很多产品都期待借助 Widget 来丰盛本人产品的内容表白。
然而,Widget 设计的初衷是简单明了的在失当的机会展现一些带有个性化定制的内容,为了不让主屏幕的整体应用体验变得复杂,Widget 从技术上就做的很克服,限度了很多很多的能力。因而我认为 Widget 不会成为下一个互联网公司竞争的流量入口,它会成为 App 进步用户体验的利器。
从技术角度看,SwiftUI Only 这种看似“激进”的策略其实也是一种信号,其实也是在通知大家苹果对于 Swift 以及 SwiftUI 的器重水平。
尽管,从目前来看 Pure SwiftUI 的设计,能够做的事件真的很少,然而我也置信,苹果会一直优化 Pure SwiftUI 的能力。让开发者能够以最低的开发成本,适配更多的平台。
最初,也期待大家能够好好钻研一下 Widget,联合本人的产品,给到用户极致的用户体验。
(WWDC 2020 精彩内容思否专栏:https://segmentfault.com/blog…
本篇内容来自于阿里巴巴淘系技术部,高级无线开发工程师柘剑。
更多精彩内容可关注【淘系技术】公众号。)
参考
iOS 14 Preview: https://www.apple.com.cn/ios/ios-14-preview/
Widgets code-along: https://developer.apple.com/news/?id=yv6so7ie
Meet WidgetKit: https://developer.apple.com/videos/play/wwdc2020/10028/
What’s new in SwiftUI: https://developer.apple.com/videos/play/wwdc2020/10041/
Add configuration and intelligence to your widgets:https://developer.apple.com/videos/play/wwdc2020/10194/
Build SwiftUI views for widgets: https://developer.apple.com/videos/play/wwdc2020/10033/
Creating a Widget Extension: https://developer.apple.com/documentation/widgetkit/creating-a-widget-extension
Building Widgets Using WidgetKit and SwiftUI:https://developer.apple.com/documentation/widgetkit/building_widgets_using_widgetkit_and_swiftui
Making a Configurable Widget: https://developer.apple.com/documentation/widgetkit/making-a-configurable-widget
Keeping a Widget Up To Date: https://developer.apple.com/documentation/widgetkit/keeping-a-widget-up-to-date
团队招人
负责手淘挪动端的根底 PaaS 及平台技术。波及挪动网关、网络减速、长连通道、图片体验等根底技术,以及海量音讯推送、浮层搭投全域触达等平台型技术,并对挪动端系统进行前沿摸索,打造了全站 IPv6、iOS 用户态网络栈、Android 最小核、自适应线程调度等高性能技术和架构。
在这里,你会面临超级 App 在性能、体验、平安等方面的极致谋求;在这里,你会站在业务和数据视角针对指标进行充沛理解和深刻优化;在这里,你会与业界各畛域大牛并肩作战、疾速成长。
咱们期待有技术、有现实的你退出,与咱们共享踊跃、通明、凋谢的团队气氛,随同着各种干货满满的分享培训以及业务和技术挑战,咱们将一起在技术畛域一直攻坚、新陈代谢,独特驶向属于咱们的星辰大海。
职位:iOS 开发、Android 开发、C++ 开发、Java 服务端开发、前端开发、数据工程师、算法工程师
感兴趣的同学可将简历发送到:zhejian.wzj@alibaba-inc.com,获取优先内推资格!