如何在vision os中发送通知?我似乎无法找到任何信息通知在视觉操作系统.

我有一个窗口,经过一段时间后,它应该提醒用户查看它,我认为通知是一个好主意(或者有没有其他方法可以做到这一点?)但我无法让它工作

我得到了请求和批准.我做错什么了吗?vision os不支持通知吗?我找不到任何与此有关的东西.是否有人设法发送通知,如果是,如何发送通知?

我try 了以下代码,但它没有执行任何操作:

let content = UNMutableNotificationContent()
content.title = "Feed the cat"
content.body = "It looks hungry"
content.sound = UNNotificationSound.default

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)

let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.add(request)

推荐答案

您错过了delegate,并且告诉UNUserNotificationCenter如何在前台显示通知.

extension NotificationManager:  UNUserNotificationCenterDelegate {
    
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification) async -> UNNotificationPresentationOptions {
        .banner
    }
}

其余的manager个看起来像.

@Observable final class NotificationManager: NSObject {
    private(set) var isPermissionGranted = false
    let userNC = UNUserNotificationCenter.current()
    
    override init() {
        super.init()
        userNC.delegate = self
    }
    
    func sendNotifications() async throws {
        let id = UUID().uuidString
        
        let content = UNMutableNotificationContent()
        content.title = "Let's feed the cat"
        content.subtitle = "It looks hungry"
        
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: true)
        let request = UNNotificationRequest(identifier: id,content: content,trigger: trigger)
        try await userNC.add(request)
        print("\(#function) :: scheduled")
    }
    
    func requestAuthorization () async throws {
        do {
            isPermissionGranted = try await userNC.requestAuthorization(options: [.alert, .badge, .sound])
        } catch {
            print(error)
        }
    }
    
    func cancelAll() {
        userNC.removeAllPendingNotificationRequests()
    }
}

请注意,您应该在应用程序的最顶端使用创建manager

@State private var manager: NotificationManager = .init()

并将其注入应用程序,

.environment(manager)

所以你可以在任何地方访问它,

@Environment(NotificationManager.self) private var manager

重要的是,delegate是稳定的,这样应用程序就不会错过通知.

这是View个样品

import SwiftUI
import RealityKit
import UserNotifications

struct NotificationSample: View {
    @Environment(NotificationManager.self) private var manager
    @State private var date: Date?
    @State private var isScheduling: Bool = false
    var body: some View {
        
        RealityView { content, attchments in
            guard let attachment = attchments.entity(for: "Feed") else {return}
            content.add(attachment)
        } update: { content, attchments in
            
        } attachments: {
            Attachment(id: "Feed") {
                VStack {
                    if let date {
                        Text(date, style: .timer)
                    }
                    Button("FEED THE CAT") {
                        isScheduling.toggle()
                    }.task(id: isScheduling) {
                        guard isScheduling else {return}
                        do {
                            try await manager.sendNotifications()
                        } catch {
                            print(error)
                        }
                        isScheduling = false
                        date = Calendar.current.date(byAdding: .minute, value: 1, to: Date())
                    }.disabled(!manager.isPermissionGranted)
                }
            }
        }
        .task {
            do {
                try await manager.requestAuthorization()
            } catch {
                print(error)
            }
            manager.cancelAll()
        }
        
    }
}

Swift相关问答推荐

在Swift中initt()完成后运行一个函数

是否在字符串属性上搜索数组和子数组?

是否可以将具有关联值的枚举强制转换为其类型与关联值匹配的变量?

如何使用AsyncTimerSequence获取初始时钟,然后在指定的时间间隔内开始迭代?

如何异步返回视图?什么?

如何写一个;风格;视图修饰符,它会影响特定类型的所有嵌套视图?

循环字典中的数组

允许视图在视图内更改

当将新值推送到 NavigationStack 时,SwiftUI 的 navigationDestination 已在堆栈的早期声明

UIBezierPath() 和 DragGesture:连接点创建角而不是曲线

使用异步收集发布者值

SwiftUI:列表背景为空列表时为黑色

如何修改下面的代码,使图像 Select 的顺序与使用快速并发的图像呈现的顺序相匹配?

如何将视图添加到多行文本视图的末尾?

使用 swift 的 Firebase 身份验证

您可以在运行时访问 Picker 元素并更改它们的 colored颜色 吗

根据禁用与否更改 SwiftUI 中按钮的 colored颜色

如何在 SwiftUI 中打开 ImagePicker?

Swift 中的 PageViewController 当前页面索引

如何发送静默推送通知有效负载