小组件可以在主屏幕上实现内容展示和功能跳转。 系统会向小组件获取时间线,根据当前时间对时间线上地数据进行展示。点击正在展示的视觉元素可以跳转到APP内,实现对应的功能。




ios appstore 发布小组件 ios开发 小组件_App

苹果ios



开发思路

首先需要明确的是小组件是一个独立于 App 环境(即 App Extension),小组件的生命周期/存储空间/运行进程都和 App 不同。所以我们需要引入这个环境下的一些基础设施,比如网络通信框架,图片缓存框架,数据持久化框架等。




ios appstore 发布小组件 ios开发 小组件_数据_02

小组件



小组件本身的生命周期是一个很有意思的点。直白地来讲小组件的生命周期是和桌面进程一致的,但这不意味着小组件能随时的执行代码完成业务。小组件使用 Timeline 定义好的数据来渲染视图,我们的代码只能在刷新 Timeline (getTimeline)和创建快照(getSnapshot)时执行。一般而言,在刷新 Timeline 时获取网络数据,在创建快照时渲染合适的视图。

大多数情况下都需要使用数据来驱动视图展示。这个数据可以通过网络请求获得,也可以利用 App Groups 的共享机制从 App 中获取。在刷新 Time Line 时获取到数据后,即可按照业务需求合成 Timeline。Timeline 是一个以 TimelineEntry 为元素的数组。 TimelineEntry 包含一个 date 的时间对象,用以告知系统在何时使用此对象来创建小组件的快照。也可以继承 TimelineEntry ,加入业务所需要的数据模型或其他信息。




ios appstore 发布小组件 ios开发 小组件_ios appstore 发布小组件_03

苹果12pro



为了使小组件展示视图,需要用 SwiftUI 来完成对小组件的布局和样式搭建。在下面会介绍如何实现布局和样式。

在用户点击小组件后,会打开 App,并调用 AppDelegate 的 openURL: 方法。我们需要在 openURL: 中处理这个事件,使用户直接跳转至所需的页面或调用某个功能。

最后,如果需要开放给用户小组件的自定义选项,则使用 Intents 框架,预先定义好数据结构,并在用户编辑小组件提供数据,系统会根据数据来绘制界面。用户选择的自定义数据都会在刷新 Time Line (getTimeline)和创建快照(getSnapshot)时以参数的形式提供出来,之后根据不同的自定义数据执行不同的业务逻辑即可。

App Extension

如果你已经有了 App Extension 的开发经验,可以直接忽略这些!

按照苹果的说法:App Extension 可以将自定义功能和内容扩展到应用程序之外,并在用户与其他应用程序或系统交互时向用户提供。例如,您的应用可以在主屏幕上显示为小部件。也就是说小组件是一种 App Extension,小组件的开发工作,基本都在 App Extension 的环境中。




ios appstore 发布小组件 ios开发 小组件_android桌面小组件开发_04

苹果手机



App 和 App Extension有什么关系?

本质上是两个独立的程序,你的主程序既不可以访问 App Extension 的代码,也不可以访问其存储空间,这完完全全就是两个进程、两个程序。App Extension 依赖你的 App 本体作为载体,如果将 App 卸载,那么 App Extension 也不会存在于系统中了。而且 App Extension 的生命周期大多数都作用于特定的领域,根据用户触发的事件由系统控制来管理。




ios appstore 发布小组件 ios开发 小组件_ios appstore 发布小组件_05

苹果12