JHHK

欢迎来到我的个人网站
行者常至 为者常成

通知与推送

参考: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一块使用,并且只能应用于网络电话
    非国区的微信,可以看下

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.