Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >IOS Widget(5):小组件刷新机制

IOS Widget(5):小组件刷新机制

作者头像
用户1155943
发布于 2021-05-13 09:24:42
发布于 2021-05-13 09:24:42
6.4K00
代码可运行
举报
文章被收录于专栏:Android点滴积累Android点滴积累
运行总次数:0
代码可运行

引言

  前面的章节学完已经让我们可以顺利实现一个小组件了,但是小组件里面的数据如何刷新的呢,本节内容将讲解IOS的刷新机制。

大纲

  • 系统如何管理小组件刷新
  • Timeline刷新机制
  • Timeline刷新机制代码实现
  • 刷新策略建议
  • 时钟刷新策略(只有小时分钟,没有秒)
  • 主动请求重新刷新

系统如何管理小组件刷新

  1. WidgetKit在一个单独的进程中渲染小组件视图
  2. 即使小组件窗口显示在屏幕上,widget extension 也不会持续处于活动状态
  3. 为了管理系统负载,WidgetKit使用预算来分配一天中的窗口小组件重载
  4. WidgetKit为用户添加到其设备的每个活动小组件维护不同的预算
  5. 每日预算通常包括40到70次刷新。该速率大致可转换为小组件每15至60分钟重新加载一次,但是由于涉及到许多因素,因此这些时间间隔是不固定的。

综上所述,小组件的刷不能由开发者自由控制,官方建议如下:

  1. 如果您的小组件可以预测应重新加载的时间点,则最好的方法是为尽可能多的将来日期生成时间线。
  2. 时间轴中的条目间隔应保持尽可能大。
  3. 时间轴应创建至少相隔5分钟的时间轴条目。
  4. WidgetKit可能会在多个窗口小组件之间合并重新加载,从而影响窗口小组件重新加载的确切时间。

Timeline刷新机制

该图显示了WidgetKit请求时间线,提供程序生成时间线以及3小时后的时间进度,之后WidgetKit请求新的时间线

该图显示了WidgetKit请求时间线,提供程序生成时间线以及WidgetKit在2小时后请求新时间线的图

Timeline刷新机制代码实现(新增组件时,系统默认就实现了)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func getTimeline(for configuration: TimeTypeConfigurationIntent, in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
    var entries: [SimpleEntry] = []

    // Generate a timeline consisting of five entries an hour apart, starting from the current date.
    let currentDate = Date()
    for hourOffset in 0 ..< 5 {
        // 下面这个代码表示,在当前日期上加上 hourOffset 个小时得到一个新的日期
        // .hour可以换成 .second .minute .day 等
        let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
        let entry = SimpleEntry(date: entryDate, configuration: configuration)
        entries.append(entry)
    }
    
    // 调用回调方法把生成好的时间线数据传递给系统
    // policy 表示刷新策略
    // .atEnd 表示,所有的时间线条目完成之后重新刷新一次,表现就是这个getTimeline方法被回调一次
    // .after(date: Date) 表示,多久时间结束后再刷新一次
    // .never表示时间轴走完就不刷了
    let timeline = Timeline(entries: entries, policy: .atEnd)
    completion(timeline)
}

备注:   网上大部分资料都写着Timeline时间轴相隔5分钟,即每次创建5分钟内的刷新条目,但是小组件预算每日40到70次刷新,假设按70次算,总时间70 * 5 = 350分钟,大约6个小时就把次数用完了。所以大部分情况5分钟的间隔确实可以满足了,但是难免还是有用户把这个限制次数用完了。保险起见,尽量把时间间隔扩大,如果内存消耗不大,可以把间隔控制在60分钟,时间轴上每个条目间隔1分钟。这样几乎不会把系统给小组件的预算刷新次数给用完。

  正是因为IOS系统对小组件有刷新次数有限制和内存方面的限制(官网没有找到,但是看到网友们说是30M左右的限制,自己使用过程中也发现了占用内存过多导致进程被挂起,小组件就展示不出来了),所以没控制好刷新策略的话,可能经常会出现小组件界面展示不出来,或者过了一段时间之后,小组件直接不刷新了。

刷新策略建议

  1. 每次刷新时,时间轴准备好15-60分钟的刷新数据,最少是5分钟
  2. 时间轴每个刷新条目时间间隔尽可能大,时钟内组件间隔可以设置为1分钟
  3. 条目数量不宜过多,越少越好,时钟组件最多60左右
  4. 不要在5分钟内创建300个条目来做时钟按秒刷新,大概率会失败

时钟刷新策略(只有小时分钟,没有秒)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static func prepareEntriesEveryMinute(_ completion: @escaping (Timeline<WidgetEntry>) -> ()) {
    // 第一次刷新时间:延迟2秒刷
    let firstDate = Provider.getFirstEntryDate()
    // 第二次刷新时间:第一个整分钟时刷
    let firstMinuteDate = Provider.getFirstMinuteEntryDate()
    
    var entries: [WidgetEntry] = []
    entries.append(WidgetEntry(date: firstDate))
    entries.append(WidgetEntry(date: firstMinuteDate))
    
    // 后面以第一个整点分钟开始,每次加一分钟刷
    for minuteOffset in 1 ..< 60 {
        guard let entryDate = Calendar.current.date(byAdding: .minute, value: minuteOffset, to: firstMinuteDate) else {
            continue
        }
        entries.append(WidgetEntry(date: entryDate))
    }
    let timeline = Timeline(entries: entries, policy: .atEnd)
    completion(timeline)
}

static func getFirstEntryDate() -> Date {
    let offsetSecond: TimeInterval = TimeInterval(2)
    var currentDate = Date()
    currentDate += offsetSecond
    return currentDate
}

// 获取第一个分钟时间点所处的时间点
static func getFirstMinuteEntryDate() -> Date {
    var currentDate = Date()
    let passSecond = Calendar.current.component(.second, from: currentDate)
    let offsetSecond: TimeInterval = TimeInterval(60 - passSecond)
    currentDate += offsetSecond
    return currentDate
}

主动请求重新刷新

如果在App中修改了小组件的数据,可以通过如下的方式主动触发WidgetKit刷新小组件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 指定刷新哪个组件
WidgetCenter.shared.reloadTimelines(ofKind: "com.mygame.character-detail")
// 刷新全部组件
WidgetCenter.shared.reloadAllTimelines()

结语

  小组件的刷新,官方文档都没有明确说明到底是什么具体的规则,只说了有各种限制,系统会动态管理。所以在实际开发中可能会遇到小组件数据不刷新的问题,遇到这种情况,请减少Timeline中的条目数量,优化内存,确保小组件代码里面没有异常。小组件运行在单独的进程,如果异常会导致小组件进程卡死了,一个小组件出问题,其他小组件都不刷新了。既然刷新这么难控制,怎么实现数字时钟按秒刷新呢?下一节揭晓。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-05-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
iOS14新特性探索之二:App Widget小组件应用
        iOS 14除了引入了亮眼的App Clips功能外。还有一个也非常惹争议的功能就是App Widget。App Widget可以理解为小组件,在非常早的Android版本中就有了Widget的概念,应用开发者可以为系统开发自己应用相契合的Widget来让用户更加方便的使用应用提供的功能。例如Android早期系统中非常常见的钟表时间组件、快捷设置组件等。用户可以将这些小组件根据自己的喜好放在屏幕的指定位置。从这点看,iOS 14提供的App Widget功能的确不能算是一种创新,最多算是一种增强。
珲少
2020/07/14
5.2K0
iOS14新特性探索之二:App Widget小组件应用
IOS Widget(2):小组件框架解析
  如果没有勾选“Include Configuration Intent”,默认生成如下代码,这里新建的时候小组件的名字是 “Widget1”
用户1155943
2021/05/06
1.4K0
iOS_SwiftUI_iOS14_Widget
在主工程里创建附属小组件:Xcode -> File -> New -> Target -> iOS -> Widget Extension:
mikimo
2022/07/20
2.4K0
iOS_SwiftUI_iOS14_Widget
IOS Widget(4-1):创建可配置小组件(静态配置数据)
  经过前面几篇文章阅读,已经掌握开发一款小组件的基本技能了,接下来开始掌握一些相对高级一点的技能。本文创建一个可配置小组件,通过修改时间类型,让Text空间显示不同格式的时间。
用户1155943
2021/05/10
1.8K0
IOS Widget(4-1):创建可配置小组件(静态配置数据)
IOS Widget(4-2):创建可配置小组件(动态修改配置数据)
  上一篇文章,讲解了如果通过配置修改小组件行为,只不过配置数据是写死的,本文将继续探索配置数据的高级用法,配置数据在小组件中动态创建的
用户1155943
2021/05/10
3.5K0
IOS Widget(4-2):创建可配置小组件(动态修改配置数据)
iOS14 致敬 Android 之 "Meet Widget"
Widgets 可以显示你 App 相关的内容,使用户可以快速访问您的应用以获取更多详细的信息;一个 iOS App 可以提供多种样式的 Widget ,使用户可以专注于那些对自己最有价值的信息;我们可以添加同一 Widget 的多个副本,从而根据其独特的需求和布局定制每个 Widget;如果 Widget 中有自定义的功能,则用户可以分别个性化 Widget;Widget 支持多种尺寸,你可以根据实际情况选择适合自己的尺寸,在屏幕可用空间有限的情况下,Widget 呈现的信息将是用户最关心的。
HelloWorld杰少
2022/08/04
1.4K0
iOS14 致敬 Android 之 "Meet Widget"
干货 | 携程机票iOS Widget实践
作者简介 Derek Yang,携程资深研发经理,专注于iOS开发&跨端技术研究,热衷于新技术探索。 一、前言 2020年9月苹果发布了iOS 14.0,相较之前有了很大的功能改观,很重要的一点是用户可以更加个性化的定义自己的桌面,Widget就是这项功能的主角。 近期接到一项产品需求,需要实现若干机票业务相关的Widget,此文总结该需求开发上线过程中的踩坑填坑经验。 Widget俗称小组件,是苹果推出的众多App Extension中的一款。因此在介绍Widget之前,需要先了解App Extensi
携程技术
2022/05/12
1.4K0
干货 | 携程机票iOS Widget实践
IOS小组件(6):小组件实现时钟按秒刷新
  上一节中我们了解了IOS小组件的刷新机制,发现根本没法实现按秒刷新,但是看别的App里面有做到,以为用了什么黑科技,原来是因为系统提供了一个额外的机制实现时间的动态更新,不用走小组件的刷新机制。
用户1155943
2021/05/18
4.3K3
IOS小组件(6):小组件实现时钟按秒刷新
Apple Widget:下一个顶级流量入口?
2020 年 6 月 22 日,苹果召开了第一次线上的开发者大会 - WWDC20。这可谓是一次可以载入史册的发布会,宣布了 ARM 架构 Mac 芯片、软硬件的生态大统一、iOS 14 系统界面大改等一系列激动人心的消息。
用户2932962
2020/07/29
2K0
Apple Widget:下一个顶级流量入口?
iOS17适配指南之Widget
YungFan
2023/08/24
1.2K0
iOS17适配指南之Widget
SwiftUI 动画进阶 — Part4:TimelineView
前三篇高级 SwiftUI 动画系列是作者在 WWDC 2021 之前实战总结的内容。对 2021 年 WWDC 介绍的 TimelineView 和 Canvas 感到激动。这开启了一个全新的可能性,笔者将试图在这一部分和下一部分的系列中阐释这些可能性。
Swift社区
2022/04/04
3.8K0
SwiftUI 动画进阶 — Part4:TimelineView
iOS开发之WidgetKit
iOS 14 Apple 推出了 WidgetKit,Widget 就像一个迷你版的 App,可以快速访问它所提供的信息—比如天气、日历事件、笔记等。Widget 还可以充当“快捷方式”,点击它会立即跳转到 App 的指定位置。
YungFan
2020/08/17
2.7K0
pg之CheckPoint机制
checkpoint又名检查点,一般checkpoint会将某个时间点之前的脏数据全部刷新到磁盘,以实现数据的一致性与完整性。目前各个流行的关系型数据库都具备checkpoint功能,其主要目的是为了缩短崩溃恢复时间,以Oracle为例,在进行数据恢复时,会以最近的checkpoint为参考点执行事务前滚。而在WAL机制的浅析中,也提过PostgreSQL在崩溃恢复时会以最近的checkpoint为基础,不断应用这之后的WAL日志。
DB之路
2021/03/16
1.6K0
IOS Widget(3):SwiftUI开发小组件布局入门
  经过上一篇文章,我们已经可以在桌面上展示出一个小组件出来了,你肯定想小试牛刀,动手改一改,那我们就从改小组件的布局做起吧。本文不会讲解Swift语法,如果是熟悉Flutter,Kotlin这种语言的,问题也不大。本文只讲解小组件中常用的SwiftUI组件。
用户1155943
2021/05/10
3.4K0
IOS Widget(3):SwiftUI开发小组件布局入门
Unity3D使用Cinemachine配合Timeline实现运镜效果
Unity3D中的插件Cinemachine高级虚拟摄像系统,配合Timeline时间轴一起使用,可以实现像电影级别的分镜等效果,这篇我们就继续用上个模拟收费通过的项目,在这个基础上使用Cinemachine配合Timeline实现一个运镜的效果。
Vaccae
2020/09/01
3.5K0
Unity3D使用Cinemachine配合Timeline实现运镜效果
酷我音乐iOS小组件适配开发实践
本文来自TME腾讯音乐娱乐-酷我音乐团队,迈腾大队长投稿,本文仅作为个人学习记录使用,也欢迎在许可协议范围内转载或使用,请尊重版权并且保留原文链接,谢谢您的理解合作. 如果您觉得本文章对您能有帮助,您可以使用关注此公众号,感谢支持.
QQ音乐技术团队
2023/12/15
1.1K0
酷我音乐iOS小组件适配开发实践
改进Apache Hudi的标记机制
Hudi 支持在写入操作期间对存储上未提交的数据进行全自动清理。 Apache Hudi 表中的写入操作使用标记来有效地跟踪写入存储的数据文件。 在这篇博文中,我们深入探讨了现有的直接标记文件机制的设计,并解释了它在 AWS S3 等云存储上对于非常大的写入的性能问题。 我们展示了如何通过引入基于时间线服务器的标记来提高写入性能。
从大数据到人工智能
2022/05/26
8620
改进Apache Hudi的标记机制
有趣的 PerformanceObserver
之前在研究小伙伴遗留代码的时候,发现了PerformanceObserver这玩意,不看不知道,越看越有意思。
被删
2024/05/16
6040
有趣的 PerformanceObserver
Unity3D使用Timeline实现过场动画
在《Unity3D使用Cinemachine配合Timeline实现运镜效果》一篇中我们已经实现了简单的运镜效果,这一篇还是利用TimeLine做动画,然后通过事件触发,实现一个过场动画的效果。
Vaccae
2020/10/27
2.7K0
Unity3D使用Timeline实现过场动画
Markwhen:面向开发人员的Markdown时间线工具
作为一名开发者,我喜欢Markdown。有人反对使用它,理由是其格式并非强制执行——例如,它允许存在不同的版本和名称相似的模式。然而,它的弱点也是它的优势。这就引出了Markwhen,它自称是一个“文本到时间线工具,你可以编写类似Markdown的文本,它会将其转换为美观的级联时间线或其他可视化效果”。
云云众生s
2024/12/10
1420
Markwhen:面向开发人员的Markdown时间线工具
相关推荐
iOS14新特性探索之二:App Widget小组件应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验