如何在iOS 14小部件中添加按钮

14

我试图为一个家族类型为“.systemLarge”的小部件添加按钮。我想在不打开应用程序的情况下执行一些代码。

有人知道如何做到这一点吗?

例如,快捷方式应用程序小部件包括可以轻触的按钮,以执行无需打开应用程序的快捷方式。


https://dev59.com/r77pa4cB1Zd3GeqP7uDD#66006151 - YodagamaHeshan
现在在iOS 17中已经可以实现了!回答在这里:https://stackoverflow.com/a/77190038/1759443 - undefined
3个回答

7

1
好的,我不确定是因为他们在那个提示中没有明确提到按钮。当然,由于快捷方式应用程序小部件。但这并不是他们自己的应用程序第一次没有遵守指南。 - Spriter
1
我在iOS 13小部件中添加了按钮,没有任何限制或问题! - Ahmadreza
是的。旧款小部件可以支持按钮。新的iOS 14小部件则不行。 - DanubePM
地图应用程序在小部件内使用按钮。因此在某种程度上是可能的。 - Evgen Bodunov
1
Yes Maps有2个按钮,但它们都会打开应用程序。然后,由于在每个按钮上设置了widgetUrl,所以执行一个操作。当应用程序打开时,onOpenUrl()进行必要的检查以执行适当的操作。浪费了一天的时间来弄清楚所有这些...我需要一个按钮,可以将小部件上的数字从友好显示(k、M、B)切换到完整数字。 - iOS Flow

7
你可以在中型和大型小部件上添加链接控件,以实现按钮的行为。
这不会允许您创建交互式小部件,即无法通过单击小部件内的元素来更改其内容。 但是,您将能够根据小部件激活时提供的widgetUrl告诉哪个“链接”被单击了。
请参见此处的章节响应用户交互https://developer.apple.com/documentation/widgetkit/creating-a-widget-extension

似乎每个小部件只支持一个URL,所以无法确定位置。不过还是很酷的。 - Logan

0

现在在iOS 17中可用!

点击此处查看详情

从iOS 17、iPadOS 17或macOS 14开始,小部件和实时活动可以包含按钮和开关,以提供特定的应用功能,而无需启动应用程序。

例如,提醒事项小部件允许用户使用开关将任务标记为已完成。在锁定设备上,按钮和开关是不活动的,除非用户进行身份验证并解锁设备,否则系统不会执行任何操作。

将功能添加为意图

  1. 创建一个结构体
    • 对于小部件,采用AppIntent协议
    • 对于实时活动,采用LiveActivityIntent协议
  2. 通过@Parameter属性包装器定义输入参数(必须符合AppEntity
  3. 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()函数是异步的,并且被标记为抛出异常。
  • 当你从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
       }
    }
}

Pre-iOS 17解决方案

虽然有一些限制,但是可以实现

  1. 你不能直接执行代码,只能通过深度链接到你的应用程序,然后处理点击事件。
  2. systemSmall小部件被视为一个可点击区域(无法对多个触摸目标进行精细控制)
  3. systemMediumsystemLarge可以有更多的触摸目标,并使用Link通过特定操作的深度链接到你的应用程序。

要查看一个示例,了解如何实现,请参考这篇文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接