# iOS 小组件研究

By [Untitled](https://paragraph.com/@0x673cf4a29f8553e2a6efc70feb1da884fab91ffe) · 2023-12-21

---

1、设备只支持iPhone，并且是有“药丸屏”的iPhone14Pro和14Pro Max上； 2、Max系统版本、编译器及iOS系统版本：>=MacOS12.4、>=Xcode14.0+beta4、>=iOS16.1+beta； 3、使用 ActivityKit 用于配置、开始、更新、结束实现 Live Activity 能力。使用 WidgetKit 、SwiftUI 在widget 小组件中创建 Live Activity 的用户界面，这样小组件和 Live Activity 的代码是可以共享； 4、Live Activity 目前只能通过 ActivityKit 从主工程获取数据，或者从 远程通知 获取最新数据；无法访问网络或者接受位置更新信息 5、 ActivityKit 和 远程通知推送 更新的数据不能超过4KB； 6、Live Activity 可以给不同的控制绑定不同的 deeplink，使其跳转到不同的页面； 7、Live Activity 在用户主动结束前最多存活8小时； 8、已经结束的 Live Activity 在锁屏也最多保留4小时，所以一个 Live Activity 最长可以停留12小时； 9、最多同时存在两组 Live Activity ，排列顺序待发现

作者：HarryDeng 链接：[https://juejin.cn/post/7153236337074634788](https://juejin.cn/post/7153236337074634788) 来源：稀土掘金 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。

[https://zhuanlan.zhihu.com/p/661980240](https://zhuanlan.zhihu.com/p/661980240)

通过 File——new——WidgetExtension创建小组件子工程。 创建完小组件 Target 后会有三个文件： MyWidgetBundle 是小组件的代码入口文件 MyWidget 是主要的小组件代码文件 Assets 存放小组件需要用的资源

然后打开 MyWidget.swift 文件，这个文件中总共分为 5 个部分：

struct Provider 负责为小组件提供数据 struct SimpleEntry 小组件的数据模型 struct MyWidgetEntryView 小组件的视图 struct MyWidget 小组件的配置部分 struct MyWidget\_Previews 提供小组件在 Xcode 中的预览

##### 小组件类型

默认为 小 中 大 三种类型。 在 iOS 16 中，WidgetFamily 新增了 3 种新的类型来支持锁屏小组件：

accessoryCircular：圆形小组件，可以在 watchOS 中的复杂功能出现，也可以用在 iPhone 和 iPad 的锁定屏幕上，手机上 iOS 16 以上支持，但在 iPad 上需要 iPad OS 17 以上才支持。 accessoryRectangular：矩形小组件，可以显示进度视图、仪表之类的 accessoryInline：內联小组件，只能显示文本，对于较长的内容很有用

[https://zhuanlan.zhihu.com/p/661980685](https://zhuanlan.zhihu.com/p/661980685)

小组件的刷新频率 前面介绍了时间线的更新策略，但 iOS 系统真的会按照我们设定的时间线来更新吗？答案是不一定！

因为假设你设置时间线每秒钟刷新一次数据，会加重系统的负担，所以苹果对于小组件的刷新频率增加了一些限制，以 24 小时为一个周期，每天能刷新多少次取决于三个条件：

小组件向用户进行显示的频率和次数。 小组件的上次重新载入时间。 小组件的包含 App 是否处于活跃状态。 对于用户经常查看的小组件，每日最大的刷新次数为 40 到 70 次，大致换算为每 15 到 60 分钟重载一次小组件。

文章目录 [iOS 小组件开发第十二篇：iOS 17 适配](https://zhuanlan.zhihu.com/p/663965934)

信息通讯 [IOS手把手轻松实现灵动岛（Live activity） - 简书 (jianshu.com)](https://www.jianshu.com/p/10541a43010c) **_Live activity也支持远程推送更新，根据文档以下9点要求实现（Activity远程通知每小时有通知预算<数量未明确>，超出后系统将关闭通知）_**

1.  **_确保主程序已经开通了远程推送功能_**
    
2.  \_确保启动activity时`request(attributes:contentState:pushType:)`传入pushType参数（.token）
    
3.  **_获取启动后的activity的推送令牌pushToken，传给服务端用来推送更新activity_**
    
4.  **_服务端推送的更新内容字段需要和ActivityAttributes的_**`ContentState` 中定义的动态数据字段对应
    
5.  **_设置推送的报头apns-push-type的值为liveactivity_**
    
6.  **_设置推送的报头apns-topic的值为.push-type.liveactivity_**
    
    *   **_正确的推送对应的内容和状态_**
        
    *   **_使用_**`pushTokenUpdates`监听pushToken变化，如有变化，就令牌失效，需要将新的令牌传给服务器
        
    *   **_当Activity结束时，服务器端的pushToken将失效_**
        
7.  作者：OC蜗牛链接：[https://www.jianshu.com/p/10541a43010c](https://www.jianshu.com/p/10541a43010c)来源：简书著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。

---

*Originally published on [Untitled](https://paragraph.com/@0x673cf4a29f8553e2a6efc70feb1da884fab91ffe/ios)*
