定时器到期时推送通知



我正在为我正在构建的watchOS中的计时器应用程序设置推送通知,以防用户将该应用程序置于后台。我已经在init中从用户那里收集了权限,但我正在尝试使用UNNotificationRequest设置本地通知。然而,当我设置UNNotificationRequest时,当我试图将其添加到代码中时,会遇到Type '()' cannot conform to 'View'的错误。

我试图将此请求添加到NavigationLink区域和第二个View Controller区域,这两个区域都导致我收到上面列出的相同错误(Type '()' cannot conform to 'View')-启用通知的替代方案是什么?

代码如下所示:

import SwiftUI
import UserNotifications
struct ContentView: View {
@State var secondScreenShown = false
@State var timerVal = 60
var body: some View {
VStack{
Picker(selection: $timerVal, label: Text("Set Half Time")) {
Text("1").tag(60)
Text("2").tag(120)
Text("20").tag(1200)
Text("25").tag(1500)
Text("30").tag(1800)
Text("35").tag(2100)
Text("40").tag(2400)
Text("45").tag(2700)

}
NavigationLink(destination: SecondView(secondScreenShown: $secondScreenShown, timerVal: timerVal), isActive: $secondScreenShown) {
Text("Set Half!")
///Trying to enable notifications when the user presses "Set Half"
let center = UNUserNotificationCenter.current()

let content = UNMutableNotificationContent()
content.title = "Title"
content.subtitle = "Subtitle"

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: TimeInterval(timerVal), repeats: false)

let request = UNNotificationRequest(identifier: "Identifier", content: content, trigger: trigger)

UNUserNotificationCenter.current().add(request)

}
}
}
}
struct SecondView: View {
@Binding var secondScreenShown: Bool
@State var timerVal: Int
@State var stoppage: Int = 60
@State var overtime: Bool = false

var body: some View {
VStack{
if timerVal > 0 || overtime {
Text("Time Remaining in Half")
.font(.system(size: 14))
HStack(spacing: 33){
Text("(timerVal / 60)")
.font(.system(size: 40))
Text("(timerVal % 60)")
.font(.system(size: 40))
.onAppear(){
Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { inv in
if self.timerVal > 0 {
self.timerVal -= 1
if self.timerVal == 0 {
inv.invalidate()
}
}
}
}

}
HStack{
Text("Minutes")
.font(.system(size: 14))
Text("seconds")
.font(.system(size: 14))
}
Button(action: {
self.secondScreenShown = false
}) {
Text("Cancel")
.foregroundColor(.red)
}

} else {

VStack{
Picker(selection: $stoppage, label: Text("Add Stoppage Time?")) {
Text("1").tag(60)
Text("2").tag(120)
Text("3").tag(180)
Text("4").tag(240)
Text("5").tag(300)
Text("6").tag(360)
Text("7").tag(420)
Text("8").tag(480)
Text("9").tag(540)
}
Button(action: {
self.timerVal = self.stoppage
self.overtime = true
}) {
Text("Add Stoppage")
.foregroundColor(.green)
}
Button(action: {
self.secondScreenShown = false
}) {
Text("Done")
.foregroundColor(.red)
}

}

}
}
}

}


struct ContentView_Previews: PreviewProvider {
static var previews: some View {
Group {
ContentView()
ContentView()
}
}
}

它显示错误,因为您已经在View部分中写入了添加通知代码。

View仅用于呈现内容,不用于编写动作。

您可以编写以下代码,以便在执行导航时添加本地通知。

struct ContentViewNotification: View {
@State var secondScreenShown = false
@State var timerVal = 60
var body: some View {

NavigationView {

VStack{
Picker(selection: $timerVal, label: Text("Set Half Time")) {
Text("1").tag(60)
Text("2").tag(120)
Text("20").tag(1200)
Text("25").tag(1500)
Text("30").tag(1800)
Text("35").tag(2100)
Text("40").tag(2400)
Text("45").tag(2700)

}.onChange(of: timerVal) { val in
self.secondScreenShown = true
}


NavigationLink(destination: SecondView(secondScreenShown: $secondScreenShown, timerVal: timerVal), isActive: $secondScreenShown) {
Text("Set Half!")
}.simultaneousGesture(TapGesture().onEnded {

//Trying to enable notifications when the user presses "Set Half"
let center = UNUserNotificationCenter.current()
let content = UNMutableNotificationContent()
content.title = "Title"
content.subtitle = "Subtitle"
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: TimeInterval(timerVal), repeats: false)
let request = UNNotificationRequest(identifier: "Identifier", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request)
})
}
}
}
}

最新更新