我试图为一个家族类型为“.systemLarge”的小部件添加按钮。我想在不打开应用程序的情况下执行一些代码。
有人知道如何做到这一点吗?
例如,快捷方式应用程序小部件包括可以轻触的按钮,以执行无需打开应用程序的快捷方式。
我试图为一个家族类型为“.systemLarge”的小部件添加按钮。我想在不打开应用程序的情况下执行一些代码。
有人知道如何做到这一点吗?
例如,快捷方式应用程序小部件包括可以轻触的按钮,以执行无需打开应用程序的快捷方式。
https://developer.apple.com/documentation/widgetkit/creating-a-widget-extension
小部件呈现只读信息,不支持可滚动元素或开关之类的交互元素。WidgetKit 在渲染小部件内容时省略交互元素。从iOS 17、iPadOS 17或macOS 14开始,小部件和实时活动可以包含按钮和开关,以提供特定的应用功能,而无需启动应用程序。
例如,提醒事项小部件允许用户使用开关将任务标记为已完成。在锁定设备上,按钮和开关是不活动的,除非用户进行身份验证并解锁设备,否则系统不会执行任何操作。
AppIntent
协议LiveActivityIntent
协议@Parameter
属性包装器定义输入参数(必须符合AppEntity
)perform()
函数中,添加您想要在点击时执行的操作示例:
@available(iOS 16.0, macOS 13.0, watchOS 9.0, tvOS 16.0, *)
struct SuperCharge: AppIntent {
static var title: LocalizedStringResource = "Emoji Ranger SuperCharger"
static var description = IntentDescription("All heroes get instant 100% health.")
func perform() async throws -> some IntentResult {
EmojiRanger.superchargeHeros()
return .result()
}
}
注意事项
perform()
函数是异步的,并且被标记为抛出异常。struct EmojiRangerWidgetEntryView: View {
var entry: SimpleEntry
@Environment(\.widgetFamily) var family
@ViewBuilder
var body: some View {
switch family {
// Code for other widget sizes.
case .systemLarge:
if #available(iOS 17.0, *) {
HStack(alignment: .top) {
Button(intent: SuperCharge()) {
Image(systemName: "bolt.fill")
}
}
.tint(.white)
.padding()
}
// ...rest of view
}
}
}
虽然有一些限制,但是可以实现
systemSmall
小部件被视为一个可点击区域(无法对多个触摸目标进行精细控制)systemMedium
和systemLarge
可以有更多的触摸目标,并使用Link
通过特定操作的深度链接到你的应用程序。要查看一个示例,了解如何实现,请参考这篇文章。