ios中在app应用内刷新小组件数据

需求: 

我们需要在app应用内刷新时间线,让桌面小组件加载最新的内容。即app内修改了共享数据后,需要通知桌面小组件强制刷新,显示改变后的内容。

当某种情况影响到小组件的当前时间线时,您的 App 可以指示 WidgetKit 请求一个新的时间线。在上面的游戏小组件示例中,如果 App 收到一条推送通知,说明队友已为角色提供了治疗药水,则 App 可以指示 WidgetKit 重新载入时间线并更新小组件的内容。为重新载入特定类型的小组件,您的 App 会使用

WidgetCenter.shared.reloadTimelines(ofKind: "你小组件的kind")

看完此篇文章您将实现一下效果:

项目配置和实现:

注意点:共享数据组请用自己的开发者账号进行调试 

app内代码:

#import "ViewController.h"
#import "MyJbbDemo-Swift.h"
@interface ViewController ()
@property (nonatomic, strong) UIButton *startButton;
@property (nonatomic, assign) bool isChange;
@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.view.backgroundColor = [UIColor whiteColor];UIButton *startButton = [UIButton buttonWithType:UIButtonTypeSystem];startButton.frame = CGRectMake(0, 0, 200, 50);startButton.backgroundColor = UIColor.greenColor;startButton.layer.cornerRadius = 25;[self.view addSubview:startButton];[startButton setTitle:@"切换小组件上显示的图片" forState:UIControlStateNormal];[startButton setTintColor:[UIColor whiteColor]];startButton.center = self.view.center;[startButton addTarget:self action:@selector(startClick:) forControlEvents:UIControlEventTouchUpInside];NSFileManager *fileManager = [NSFileManager defaultManager];NSURL *pathURL = [fileManager containerURLForSecurityApplicationGroupIdentifier:@"你的组ID"];pathURL = [pathURL URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", @"testWidgetImage"]];UIImage *image = [UIImage imageNamed:@"1111"];BOOL success = [UIImagePNGRepresentation(image) writeToURL:pathURL atomically:YES];}- (void)startClick:(UIButton *)sender {NSFileManager *fileManager = [NSFileManager defaultManager];NSURL *pathURL = [fileManager containerURLForSecurityApplicationGroupIdentifier:@"你的组ID"];pathURL = [pathURL URLByAppendingPathComponent:[NSString stringWithFormat:@"%@.png", @"testWidgetImage"]];UIImage *image = [UIImage imageNamed:@"2222"];if(self.isChange){image = [UIImage imageNamed:@"1111"];}self.isChange = !self.isChange;BOOL success = [UIImagePNGRepresentation(image) writeToURL:pathURL atomically:YES];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{WidgetTool *tool = [[WidgetTool alloc] init];[tool refreshAllWidget];[[UIApplication sharedApplication] performSelector:@selector(suspend)];});
}@end

 因为我的项目是oc项目,所以我使用了侨接,来调用swift方法去通知小组件刷新:


import WidgetKit@objcMembers class WidgetTool: NSObject {@available(iOS 14, *)@objc func refreshAllWidget() {
#if arch(arm64) || arch(i386) || arch(x86_64)WidgetCenter.shared.reloadAllTimelines()
#endif}}

小组件的代码就比较简单了:

import WidgetKit
import SwiftUI
import Intentsstruct Provider: IntentTimelineProvider {func placeholder(in context: Context) -> SimpleEntry {SimpleEntry(date: Date(), configuration: ConfigurationIntent())}func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) {let entry = SimpleEntry(date: Date(), configuration: configuration)completion(entry)}func getTimeline(for configuration: ConfigurationIntent, 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 {
//            let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
//            let entry = SimpleEntry(date: entryDate, configuration: configuration)
//            entries.append(entry)
//        }
//
//        let timeline = Timeline(entries: entries, policy: .atEnd)
//        completion(timeline)var entries: [SimpleEntry] = []let currentDate = Date()for hourOffset in 0 ... 23 {let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!let entry = SimpleEntry(date: entryDate, configuration: configuration)entries.append(entry)}let timeline = Timeline(entries: entries, policy: .never)completion(timeline)}
}struct SimpleEntry: TimelineEntry {let date: Datelet configuration: ConfigurationIntent
}struct testExtensionEntryView : View {var entry: Provider.Entryvar body: some View {getImage().resizable().frame(width: .infinity, height: .infinity).scaledToFill()
//        Text("aaaaaa")
//            .foregroundColor(Color.red)}
}struct testExtension: Widget {let kind: String = "testExtension"var body: some WidgetConfiguration {IntentConfiguration(kind: kind, intent: ConfigurationIntent.self, provider: Provider()) { entry intestExtensionEntryView(entry: entry)}.configurationDisplayName("My Widget").description("This is an example widget.")}
}struct testExtension_Previews: PreviewProvider {static var previews: some View {testExtensionEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent())).previewContext(WidgetPreviewContext(family: .systemSmall))}
}func getImage() -> Image {let manager = FileManager.defaultlet floderURL:URL = manager.containerURL(forSecurityApplicationGroupIdentifier: "你的组ID")!let str = "testWidgetImage.png"let fileURL:URL = floderURL.appendingPathComponent(str)do {let data: Data = try Data.init(contentsOf: fileURL)let image = UIImage.init(data: data)return Image(uiImage: image!)} catch let error{print(error.localizedDescription)return Image("WidgetBackground")}
}

demo下载案例:

https://download.csdn.net/download/IT_Scratch/87389805?spm=1001.2014.3001.5501icon-default.png?t=MBR7https://download.csdn.net/download/IT_Scratch/87389805?spm=1001.2014.3001.5501

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/47053.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 仿苹果 小组件,仿ios14桌面小部件

仿ios14桌面小部件&#xff0c;这是一款面向广大安卓手机用户推出的高仿iOS14桌面插件软件&#xff0c;大家可以使用这款软件快速完成自己想要的桌面显示&#xff0c;多种插件一键点击轻松完成设置过程&#xff0c;让大家体验到同款iOS14桌面强大的功能&#xff0c;非常有意思的…

iOS14 小组件 开发1

前言:小组件的开发和我们正常情况开发App的逻辑是一样的,正常情况分为:网络请求,数据模型,view,渲染.只不过是小组件的开发使用了 swiftUI 语言来编写,所以要对SwiftUI的空间有所了解. 好!那我们接下来开始我们的小组件开发吧. 首先,创建Widget Extension 然后选择证书,起个名…

Android-为应用添加widget小组件

最近在实现为应用程序添加小组件的功能&#xff0c;记录一下开发过程。 1.添加一个小组件模板 设置组件类名称&#xff0c;其他属性按需求设置&#xff0c;这些属性在生成的文件中也可修改 ​​​​​​ 工程main目录下会生成类文件&#xff0c;res目录下生成资源文件&#x…

iOS 15 新增多个实用小组件

iOS 14 上线加入的桌面小组件功能非常受欢迎&#xff0c;因此苹果iOS 15新系统对小组件功能进行深度优化&#xff0c;并加入了多个实用又有趣的小组件。用户可以简单通过上下滑动来选择、重新排列、智能堆栈小组件&#xff0c;也可以对它们进行删除、智能旋转&#xff0c;还可以…

Widget小组件

目录 技能点 Widget背调 a. 设计定位 b. Widget小组件限制 c. Widget小组件 开发须知 d. 什么是 SwiftUI App Group 数据共享 a. 配置 App Groups 1、开发者账号配置&#xff0c;并更新pp证书 2、Xcode配置 b. 缓存数据共享-代码实现 1、文件存储 2. 沙盒存储&…

iOS_小组件widget基本功能

创建 在当前工程里新建target 选择Today Extension 独立应用 widget虽做为应用的扩展, 但却是两个完全独立的应用 widget上线需要单独申请 AppID 和 Bundle Identifier , 需要配置 证书 和 Provisioning Profiles(配置文件) 第三方pod导入, 也的重新导入一份 target MMWidg…

iOS 14-Widget小组件2—实现

Widget 实现 认识与配置实现效果图支持显示方式交互数据共享刷新策略网络加载屏幕适配支持多个小部件布局例子源码其他问题参考认识与配置 上一篇文章已经做了比较详细的介绍与创建配置iOS 14-Widget小组件1—初识 实现效果图 支持显示方式 @main 入口添加.supportedFamilie…

自定义开发苹果手机显示汽车小组件

实时获取汽车数据信息实时获取汽车定位信息&#xff08;点击地址进入高德&#xff09;显示当前位置的天气情况可定制显示当前城市是否限行可定制当前城市油价信息实时刷新最新数据 感兴趣的可以私聊加群

iOS 小组件 widget

苹果官网文档&#xff08;apple developer&#xff09;widgetkit 文章目录 1.创建小组件2.编辑小组件3.数据共享4.拖动排序5.参考链接 1.创建小组件 File -> New -> Target 搜索widget,点击next 勾上Include Configuration Intent, 表示需要编辑小组件&#xff0c;点击f…

iOS 小组件 widget 编辑小组件

返回小组件专栏&#xff1a;iOS 小组件 widget 文章目录 1.编辑小组件2.intentHandler 1.编辑小组件 如下图&#xff0c;编辑小组件&#xff0c;需要在GirlWidget.intentdefinition中配置 点击右下角的加号&#xff0c;新建一个枚举类型 枚举类型改名MyEnum,并添加三个值 …

iOS 小组件开发

iOS14之后Apple引入了新的WidgetKit&#xff0c;舍弃了原有额TodayExtension。 开发准备&#xff1a; 新的WidgetExtension只能通过SwiftUI进行开发&#xff1b; Widget有三种尺寸&#xff1a;systemSmall、 systemMedium、systemLarge&#xff0c;三种尺寸对应固定的UI类型布…

iOS 小组件 widget group id, app group, 数据共享

返回小组件专栏&#xff1a;iOS 小组件 widget 主APP, 小组件&#xff0c; 小组件的intent是三个独立的target, 需要有三个bundle id和对应的配置文件。而且他们的bundle identifier是从属关系。小组件的bundle id必须以主app的bundle id作为前缀。比如主app的为“com.test”&a…

演讲实录:指标平台+AI 的技术落地和未来展望

7月14日&#xff0c;以“释放数智生产力”为主题的 Kyligence 用户大会在上海成功举行。大会现场发布了 Kyligence 最新产品家族&#xff1a;AI 数智助理——Kyligence Copilot 的预览版、一站式指标平台 Kyligence Zen 的 Cloud 和 Enterprise 版本&#xff0c;以及企业级 OLA…

程序员坐行李箱迎寒风编码 2 小时,目击者:激励我写了一篇论文!

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 对于很多程序员而言&#xff0c;工作三连无疑就是——“查 bug、改 bug 、写 bug ”。 程序员加班的话题&#xff0c;也早已经不足为奇&#xff0c;实际上除了办公室&#xff0c;地铁站…

解决Windows update medic service服务禁用不了拒绝访问

很多小伙伴发现禁用Windows update服务后没几天又自动开启&#xff0c;无法禁用自动更新就是因为Windows update medic service服务导致&#xff0c;但是在禁用Windows update medic service服务的时候又出现拒绝访问&#xff0c;如下 解决方法&#xff1a; 方法一&#xff1…

Windows10禁止更新中关于Windows Update Medic Service拒绝访问的问题

1.首先以管理员身份运行cmd输入 REG add "HKLM\SYSTEM\CurrentControlSet\Services\WaaSMedicSvc" /v "Start" /t REG_DWORD /d "4" /f 这一步已经将Windows Update Medic Service禁用了&#xff0c;但是还能恢复 2.运行“regedit”&#xff0…

windows任务计划程序拒绝访问

问题现象&#xff1a;在windows任务计划程序中添加脚本程序&#xff0c;执行相应脚本&#xff0c;报了拒绝访问和创建目录需要输入参数问题 问题分析&#xff1a;没有权限执行脚本 问题解决&#xff1a;除了填写相应位置的脚本之外&#xff0c;还需要填写起始于的脚本所在路径…

windowsupdate拒绝访问怎么解决?

很多的小伙伴在开机电脑的时候都遇到过提示windowsupdate拒绝访问那么该怎么办呢&#xff1f;下面小编就为你们带来了windowsupdate拒绝访问解决方法&#xff0c;快来一起看看吧。 windowsupdate拒绝访问怎么解决&#xff1f; 1、右击左下角开始点击“运行”。 2、随后在输入栏…

更改操作系统密码导致vcenter访问出现503问题,已经如何正确更改vcenter操作系统密码

1、问题出现原因&#xff1a;vcenter 虚拟机cpu占用过高导致卡顿&#xff0c;想扩容cpu&#xff0c;需要关闭vcenter虚拟机&#xff0c;等扩容完启动的时候发现vcenter已启动&#xff0c;但页面访问出现503错误。 2、思路分析&#xff1a;503错误基本原因都是因为vpxd服务没有…

Windows10/11在使用微软账号登录后无法远程桌面

Windows10/11在使用微软账号登录后无法远程桌面 问题现象&#xff1a; 微软远程桌面在输入用户名密码点击”连接后”报”之前用于连接到的凭据无法工作 请输入新的凭据”的错误。 新安装的电脑开启远程桌面登录正常&#xff0c;但在启用微软账号后就无法登录&#xff0c;提示…