注意:不管程序是 foreground running, background running 还是 not running,只要在通知中心添加了“推送请求”,那么通知中心就可以到点触发该通知的推送。
1、本地通知
直接上代码吧
import SwiftUI import UserNotifications struct TestNotification: View { var body: some View { VStack { Text("Hello, World!") Button("推送通知"){ log.debug("click!") // 1. 创建一个“通知实体” UNMutableNotificationContent let content = UNMutableNotificationContent() content.title = "Weekly Staff Meeting" content.body = "Every Tuesday at 2pm" content.sound = .default // 注意: // 如果程序当前处于活跃状态(foreground),那么通知默认只出现在系统的“通知中心”,不会出现弹窗与声音。 // 如果程序当前处于非活跃状态(background),那么通知会出现在系统的“通知中心” + 弹窗 + 声音。 // 2. 创建一个“通知触发器” // UNCalendarNotificationTrigger 用来指定在特定的时间点触发消息推送 // UNTimeIntervalNotificationTrigger 用来指定在特定的时间间隔触发消息推送 // UNLocationNotificationTrigger 用来指定当设备 进入/离开 特定的地理位置时候触发消息推送 let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false) // 3. 创建一个 UNNotificationRequest 实例,代表一个“推送请求“ // identifier 唯一标识该“推送请求”的字符串 ID。如果同一 ID 的“推送请求”还在等待推送,那就不会重复进入“等待推送的队伍”。 // content 即上面创建的“通知实体” // trigger 即上面创建的“通知触发器”。trigger 可以设置为 nil,表示立即触发。 let request = UNNotificationRequest(identifier: "notification test", content: content, trigger: trigger) // 4. 将“推送请求”添加到系统的通知中心(第一次还需要向用户获取推送通知的权限) let notificationCenter = UNUserNotificationCenter.current() // 弹出对话框,向用户请求推送通知的权限(如果已授权,则不会重复弹窗) // 如果用户拒绝的话,那么后续 add 到通知中心的“推送请求”都会被忽略。 notificationCenter.requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in // 这是一个逃逸闭包 } // 将“推送请求”添加到系统的通知中心 notificationCenter.add(request) { error in if error != nil { log.error("无法添加到系统通知中心: \(error!)") } } } }.frame(width: 300, height: 200) } }
2、远程通知
嗯,以后用到了再说