Widget支持iOS 14以上系统,UI必须为swift UI,所以需要SwiftUI和Swift基础,XCode 12开发工具,iOS 14以上手机,废话不多说,直接上干货!
创建步骤如下:
通过Xcode -> File ->New->Target
这个名字安装功能起就行,Include Configuration Intent
这个选项暂时不勾选,这选项主要是用来支持你自定义一些属性配置(例如天气组件,用户可以选择城市,股票组件,用户可以编辑这个组件,不勾选的话是不会有编辑功能的),有兴趣的可以自己试试,这里就先不勾了,下一步
然后会在项目左侧栏中新加了一个文件夹如下:
直接运行看看效果
桌面会直接生成这个组件。然后长按组件点编辑主屏幕,点+,选中app会有三种尺寸。
JMWidgetDemo.swift文件解读
数据共享
App 与 Widget 可以通过网络数据和本地数据两种方式进行数据的共享。
1、 网络数据可通过 URLSession 完成数据的请求与解析。
2、本地数据共享可以通过 App Groups,它是 iOS 8 之后推出的在 App 之间共享数据的方式,只需要简单的配置就可以实现数据的共享。
通过
App Group
来实现具体操作如下:
新建App Group
TARGETS
->Signing & Capabiliities
->+
双击就会自动生成
新建完
App Group
之后,我这边是用UserDefaults
来实现共享数据,如下:
主app中保存数据
这个initWithSuiteName
就是上面新建App Group
生成的:group.com.xxxxx
,主app 中保存数据到UserDefaults
中。
在JMWidgetDemo.swift
文件中获取数据
OC主项目刷新Widget组件
系统提供在主app中控制widget刷新方法分别是
l 刷新所有的widget
WidgetCenter.shared.reloadAllTimelines()
l 根据widget名称对指定的widget进行刷新
WidgetCenter.shared.reloadTimelines(ofKind: "Widget1")
具体操作如下:
新建一个Swift
文件,如下:
两Targets
都要勾选哦,然后Create
可能有朋友会发现,为什么我的没有提示这个呢(可能工程之前有配置过,然后点了取消或者不创建那么之后就不会提示了)。那么:
把这个路径删除之后再重新创建文件就会有提示了,然后生成了JMDemo-Bridging-Header
这个桥接文件(Swift
调用oc
会用到这个文件),我们可以看出它是以工程名-Bridging-Header
这种方式命名的如下
然后我们command+B
,系统默认会给我们生成一个看不见的文件,JMDemo-Swift.h
,这个文件就是co
调用 Swift
的关键文件。验证一下:
注意:一定要用<>
导入要不然是找不到的。然后可以点进去看看这个文件:
主APP刷新Widget
然后我们
command+B
,在点进刚才JMDemo-swift.h这个文件拉到最下面看一下你会发现咦?好熟悉,对没错帮我自动生成了
oc
方法,这样就能愉快的玩耍了:
那么Swift如何调用OC呢,具体操作如下:
导入需要用到的头文件就可以了
JMExtensionManager声明
Swift调用
View与主应用交互提供两种交互方式如下
1、widgetURL
2、Link
在-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options处理