SwiftUI:本地通知
iOS具有一个名为UserNotifications
的框架,该框架几乎可以完全满足您的期望:让我们为用户创建可以在锁定屏幕上显示的通知。我们使用两种类型的通知,它们根据创建位置的不同而不同:本地通知是我们在本地调度的通知,远程通知(通常称为推送通知)是从某处的服务器发送的。
远程通知需要服务器才能工作,因为您将消息发送到Apple的推送通知服务(APNS),然后该服务将其转发给用户。但是相比之下,本地通知非常好用,因为只要用户允许,我们就可以随时发送任何消息。
要尝试此操作,请在 ContentView.swift 顶部附近添加一个额外的导入:
import UserNotifications
接下来,我们将建立一些基本结构,并在其中填充本地通知代码。使用本地通知需要先征求用户的许可,然后实际注册我们要显示的通知。我们会将所有这些操作放入VStack
内的单独按钮中,因此请立即将其放入ContentView
结构体中:
VStack {
Button("Request Permission") {
// first
}
Button("Schedule Notification") {
// second
}
}
好的,我们的设置已经完成,因此我们将重点放在两项重要工作中的第一个:请求授权以显示警报。通知可以采用多种形式,但是最常见的做法是要求获得显示横幅,声音和标记的权限——这并不意味着我们需要同时使用所有这些,而是要先获得权限前意味着我们以后可以选择。
当我们告诉iOS我们想要什么样的通知时,它将向用户显示提示,以便他们对我们的应用程序拥有最终决定权。当他们做出选择时,我们提供的闭包将被调用并告诉我们请求是否成功。
因此,将// first
注释替换为:
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { success, error in
if success {
print("All set!")
} else if let error = error {
print(error.localizedDescription)
}
}
如果用户授予许可,那么我们都可以开始安排通知。即使通知看起来很简单,Apple仍将通知分为三部分,以使其具有最大的灵活性:
- 内容就是应该显示的内容,可以是标题,子标题,声音,图像等。
- 触发器确定应在何时显示通知,并且可以是从现在起的秒数,将来的日期和时间或位置。
- 该请求结合了内容和触发器,还添加了唯一的标识符,因此您以后可以编辑或删除特定警报。如果您不想编辑或删除内容,请使用
UUID().uuidString
获取随机标识符。
当您只是在学习通知时,最容易使用的触发器类型是UNTimeIntervalNotificationTrigger
,它使我们可以要求从现在起的几秒钟内显示通知。因此,将// second
注释替换为:
let content = UNMutableNotificationContent()
content.title = "Feed the cat"
content.subtitle = "It looks hungry"
content.sound = UNNotificationSound.default
// 从现在起五秒钟显示此通知
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
// 选择一个随机标识符
let request = UNNotificationRequest(identifier: UUID().uuidString, content: content, trigger: trigger)
// 添加我们的通知请求
UNUserNotificationCenter.current().add(request)
如果您现在运行应用程序,请按第一个按钮以请求通知权限,然后按第二个按钮以添加实际通知。
现在,重要的部分是:一旦添加了通知,请在模拟器中按Cmd + L锁定屏幕。几秒钟后,设备应该会发出声音,并显示我们的信息——nice!