OC主工程刷新WidgetKit 桌面小组件

1,334 阅读1分钟

当想在主工程刷新小组件时,会使用到如下代码

WidgetCenter.shared.reloadAllTimelines()

1. 尝试在 AppDelegate.m中导入WidgetKit头文件

WX20201101-111048@2x.png

如图,会发现只有两个头文件,打开头文件后,找不到我们想要使用的代码定义。

2.由于第一步,所以我们创建 WidgetKitManager.swift 文件,

由于主工程是纯OC工程,因此创建时会提示我们创建桥接文件。 SwiftUIAndAppDemo-Bridging-Header

3.我们需要在WidgetKitManager.swift中编写刷新小组件的代码

import WidgetKit

@objc
@available(iOS 14.0, *)
class WidgetKitManager: NSObject {

    @objc
    static let shareManager = WidgetKitManager()
    
    /// MARK: 刷新所有小组件
    @objc
    func reloadAllTimelines() {
       #if arch(arm64) || arch(i386) || arch(x86_64)
           WidgetCenter.shared.reloadAllTimelines()
       #endif
    }

    /// MARK: 刷新单个小组件
    /*
     kind: 小组件Configuration 中的kind
     */
    @objc
    func reloadTimelines(kind: String) {
          #if arch(arm64) || arch(i386) || arch(x86_64)
        	WidgetCenter.shared.reloadTimelines(ofKind: kind)
          #endif
    }
}


4.在需要使用Swift代码的地方导入头文件,名字为主工程名-Swift.h

#import "SwiftUIAndAppDemo-Swift.h"

此文件找不到,但是实际存在1604200613994.jpg

主工程中刷新小组件的代码如下

if (@available(iOS 14.0, *)) {
        [[WidgetKitManager shareManager] reloadAllTimelines];
        
        [[WidgetKitManager shareManager] reloadTimelinesWithKind:@"Extension_Two"];
    }

备注

#if arch(arm64) || arch(i386) || arch(x86_64)
            code
            #endif

如果不加上述代码,会打包报错

刷新单个小组件或者全部小组件根据自己的需求使用,当刷新单个小组件时,传入kind值。

假如传错或者不传,暂未尝试。