swift 为什么iOS 17小部件中的交互式按钮在应用运行时不调用AppIntent perform()?

rjjhvcjd  于 5个月前  发布在  Swift
关注(0)|答案(1)|浏览(91)

在一个小部件里面,有一个按钮,

Button(intent: AnAppIntent()) {
  // Button's label.
}
// It seems this modifier does not add any value.
.invalidatableContent()

字符串
连接到AppIntent。

struct AnAppIntent: AppIntent {
  static var title: LocalizedStringResource = "An AppIntent"

  init() {
    // AppIntent required init.
  }

  func perform() async throws -> some IntentResult {

    // Never called when the app is running.

    return .result()
  }
}


该按钮在点击时调用AppIntent的perform(),因此仅当应用程序完全关闭时更新小部件UI(带或不带修饰符.invalidatableContent())*。
如果应用程序在后台处于活动状态,则不会调用perform(),并且小部件UI永远不会更新。
用户必须显式地关闭应用程序,以使小部件按预期工作。
问题可能出在所用的时间轴上。

struct SimpleEntry: TimelineEntry {
  let date: Date
}

struct Provider: TimelineProvider {
  func placeholder(in context: Context) -> SimpleEntry {
    SimpleEntry(date: Date())
  }

  func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
    completion(SimpleEntry(date: Date()))
  }

  func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
    var entries: [SimpleEntry] = []

    // Generate a timeline 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: .second, value: hourOffset, to: currentDate)!
      entries.append(SimpleEntry(date: entryDate))
    }

    let timeline = Timeline(entries: entries, policy: .atEnd)
    completion(timeline)
  }
}


但是,如果问题是时间轴,则小部件将无法在应用程序被关闭的情况下工作。

5uzkadbs

5uzkadbs1#

包含Intent的文件需要具有双重目标成员资格:它需要既是widget扩展目标的一部分,也是app目标的一部分。
所以一定要勾选这些复选框。

相关问题