参考:Lebus-2019年12月录 iOS13+Swift5通知与推送
本文是上面课程的摘要,只用于自己快速浏览.
目录
常用通知
// 回后台通知
UIKIT_EXTERN NSNotificationName const UIApplicationDidEnterBackgroundNotification
// 回前台通知
UIKIT_EXTERN NSNotificationName const UIApplicationWillEnterForegroundNotification
// 启动完成通知
UIKIT_EXTERN NSNotificationName const UIApplicationDidFinishLaunchingNotification;
// 进入活跃状态通知:启动和回前台都会调用
UIKIT_EXTERN NSNotificationName const UIApplicationDidBecomeActiveNotification;
// 收到内存警告的通知
UIKIT_EXTERN NSNotificationName const UIApplicationDidReceiveMemoryWarningNotification;
// 销毁通知
UIKIT_EXTERN NSNotificationName const UIApplicationWillTerminateNotification;
// 监听回前台
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationWillEnterForeground)
name:UIApplicationWillEnterForegroundNotification
object:nil];
// 监听回后台
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidEnterBackground)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
一、本地通知
1 在App的通知设置
允许通知
提醒
锁定屏幕
通知中心
横幅
临时
持续
声音
标记
选项
显示预览
始终(默认)
显示消息的标题和内容
解锁时
锁屏时显示配置的占位信息(没有配置显示 1个通知)
未锁屏时显示标题和内容
从不
总是显示占位信息(没有配置显示 1个通知)
通知分组
自动
按照编程时配置的分组信息进行分组
按App
同一个APP的通知会被分成一组
关
无分组
2 权限状态
未请求
拒绝
允许
隐式推送
隐式推送不会显示弹窗,默认同意
3 获取通知的设置信息
提醒
锁定屏幕
通知中心
横幅
临时
持续
声音
标记
4 options的设置:
[.alert,.sound,.badge]权限包括:提醒,声音,标记
提醒
锁定屏幕:打开
通知中心:打开
横幅:打开
声音:打开
标记:打开
[.provisional]权限包括:只有提醒的部分
提醒
锁定屏幕:关闭
通知中心:打开
[.provisional,.alert,.sound,.badge]权限包括:提醒,声音,标记
提醒
锁定屏幕:关闭,
通知中心:打开,
横幅:关闭
声音:关闭
标记:关闭
[.provisional]说明:
有这个不会弹权限窗,权限状态是provisional,
也就是说隐士推送是默认同意的,用户无感知,
隐士推送可以切换到正常的推送,重新获取权限即可
5 发送通知
发送内容content
标题title
正文body
标记badge
提示音设置
附件设置
图片
声音
视频
触发时机trigger
定时触发器
日历触发器
位置触发器
发送请求request
//相同的id,在通知中心会被覆盖
let request = UNNotificationRequest(identifier: "xxx",content: content,trigger: trigger)
发送
UNUserNotificationCenter.current().add(request,withCompletionHandler: nil)
6 隐式推送
用户无感知
部分权限的隐式推送
有提醒 声音 标记权限的隐式推送
隐式推送下扔可以请求用户权限
7 要确保在获得权限和隐式推送模式下都可发送
case .authorized, .provisional
8 通知设置权限获取
.providesAppNotificationSettings,
在通知设置界面多出一个cell
点击调用回调函数,进去用户提供的推送设置页面
9 其它类型通知
紧急通知,需要向苹果申请权限
车载通知,只有苹果自家支持
播报通知,暂未开放
10 发送可交互通知
程序在启动完成时可以设置一个或多个不同的categoryIdentifier
每个categoryIdentifier下边还可以设置一个或多个action(按钮)
identifier
id必须整个App全局唯一,在回调内用来区分是哪个action并采取相应动作
options若为空或不写则点击不会打开app
foreground--点击后会打开app
destructive--红色的按钮,点击不会打开app
authenticationRequired--需要解锁屏幕才能响应,点击不会打开app
let acceptAction = UNNotificationAction(
identifier: "ACCEPT_ACTION",
title: "同意",
options: [.foreground]
)
在发送通知时,通知可以设置自身的categoryIdentifier
当收到通知时会匹配categoryIdentifier,匹配成功会显示配置的按钮
点击按钮会调用点击通知的回调方法
11 显示预览
在设置category时设置
hiddenPreviewsBodyPlaceholder: "你有%u条新消息(隐藏预览时显示)"
隐藏预览的%u是自动计算的
12 通知分组
分组的信息显示
APP名称糗事百科
通知的title
通知的内容content
分组概要信息
在设置category时设置
categorySummaryFormat: "还有%u条来自%@的消息(分组的简介信息)",
配置通知的分组信息
content.threadIdentifier = "group_nm_vip" //分组的id
content.summaryArgument = "库克vip" //对应%@
content.summaryArgumentCount = 8 //对应%u
13 UNUserNotificationCenterDelegate
//一 在通知设置中点击“xxxx”通知设置 会调用该代理方法
func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?)
//二 当App在前台,并且通知过来的时候触发此函数,此函数同时决定在前台时消息是否展示和展示形式
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
//三 用户点击了通知时触发此函数(无论App关闭,在后台,锁屏,在前台等)
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void)
二、通知的增删改查
通知的增删改查
增加:发送通知
查
未到达通知中心
未发送通知
未移除的重复通知比如闹钟
到达通知中心
更新
通过通知ID,更新通知。比如余额提醒
删除
未到达通知删除
通知中心通知删除
自定义通知界面
先做了解,需要时再细研究
远程通知
一 远程通知流程
1 通知流程
provider server
APNs
Devices
Notification
2 通知的安全性
证书
token-based
二 向APNs注册我们的App获取deviceToken
1 deviceToken
苹果为了防止通知被滥用,设计了APNs,并需要我们向APNs注册我们的App
向苹果的APNs注册我们的APP,它分陪给我们一个deviceToken.
deviceToken可以特定到某个手机上的某个App,类似于快递地址
deviceToken不要缓存它,因为它会变
2 回调函数
注册成功的回调函数,返回deviceToken
注册失败的回调函数,返回error
3 发送通知
将deviceToken发送给我们的服务器
我们的服务器 deviceToken + 通知内容 发送给APNs
APNs根据deviceToken将通知内容发送给某台设备的某个APP
4 在xcode中的capability配置后,苹果后台就自动配置好了
三 json web token (JWT)
1 在服务器发送给苹果推送服务器 deviceTone + 推送内容 的时候苹果需要验证身份,有两种方式
方式一:证书,一个APP一个推送证书,一年的有效期
方式二:token-based,该账号下的所有APP都可以使用,永久有效
比如某公司有两个网站,用户在网站A登录成功后,后台会生成一个token,签名后,并返回给客户端
客户端存储这个token,当登录网站B时,直接上送这个token,后台就知道我们这个用户已经登录成功过了,就会直接登录而不需要用户在输入账号和密码
2 JWT 身份验证令牌,用的最多的就是JWT,防止信息被篡改
HEADER
PAYLOAD
VERIFY SIGNATURE
四 创建JWT签名秘钥 + 发送简易远程通知
开发者网站生成key,并下载.p8文件
p8文件的作用就是对在JWT中起签名作用
五 向APNs发送推送请求
deviceToken / keyId / p8文件 三样东西给到后台同事
后台按一定格式处理后发送到APNs服务器
参考文章:https://juejin.cn/post/6844904002862186503
六 JWT刷新时间+发送推送请求后APNs的响应
最短20分钟,最长1小时,刷新一次
APNs响应
后台就是客户端,苹果推送服务器是服务端
根据返回的状态码,定位错误
七 json的写法
八 payload
普通推送
紧急推送
九 区分远程推送和本地推送
十 静默推送
关闭不行,前台和后台可以.但iOS13在后台时无法回调,可能是bug
只有30秒的时间
静默推送的配置:
1.Xcode中添加Background Modes的Capability,并打开Remote notifications
2.payload的aps的值中不能有alert,sound,badge;必须有content-available,值设为1,见payload.json文件
3.服务端向APNs发送的推送请求头中,设apns-push-type为background,设apns-topic为App的bundle ID,设apns-priority为5(低优先级)
静默推送触发的函数--仅当App在后台(现阶段的iOS13有些bug,不触发)或前台时触发,App关闭时不触发
十一 拦截推送alert
比如通知加密,要进行解密
比如附件要先下载
十二 service扩展的使用
30秒时间
十三 演示图片下载
必须HTTPS
十四 演示图片下载
十五 演示图片下载
五、其它
PushKit
在关闭APP状态下也可以调起APP
Callkit
类似于电话界面
并且会添加到通讯录中
iOS13后苹果PushKit与CallKit一块使用,并且只能应用于网络电话
非国区的微信,可以看下
行者常至,为者常成!