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!
- JVM快速入门
- SQL学习之使用常用函数处理数据
- Javascript快速入门(上篇)
- SQL练习之不反复执行相同的计算
- SQL练习之求解填字游戏
- 快速入门系列--WCF--08扩展与新特性
- SQL练习之两个列值的交换
- Parcel,零配置开发 React 应用!
- 像 React Native 开发 APP 一样,用wn-cli 开发 weapp (微信小程序)
- 正则表达式快速入门
- JavaScript之<script>标签简介
- 数控机床数控系统选择4大关键要素
- Python快速入门
- Jquer学习之jQuery(function(){})与(function(){})(jQuery)之间的区别
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一款基于 Python 语言的 Linux 资源监视器!
- 我讨厌这个绿油油的头像!我用opencv换一下背景
- 哈哈哈哈哈哈镜~
- 【对二寸照片的摧残】一:人脸马赛克
- 二寸照片识别/切边/矫正
- 给彦女王生成一副蒙太奇画像
- 设计模式~单例模式
- [Bazel]自定义工具链
- async和await的使用总结 ~ 竟然一直用错了c#中的async和await的使用。。
- 全网首发:12306抢票算法大曝光?(十张图搞定)
- 全网首发:12306抢票算法大曝光?(勘误)
- 新一代垃圾回收器ZGC的探索与实践
- Python GUI项目实战(一)登录窗体的设计与实现
- Python GUI项目实战(二)主窗体的界面设计与实现
- Python GUI项目实战(三)实现信息查询功能