Swift - UserNotifications框架使用详解1(基本介绍,权限的申请与判断)

一、UserNotifications 框架介绍

1,起源

过去我们通过 UILocalNotification 来实现本地消息的推送通知(Local Notification),或者利用 APNS 进行通知消息的远程推送(Remote Notification)。如果我们程序同时用到了本地通知和远程通知,会发现它们的 API 都被随意地放在了 UIApplication 或者 UIApplicationDelegate 中,开发时代码十分混乱。

到了 iOS10,苹果新增加了一个 UserNotifications.framework(用户通知框架),目的在于统一Remote Notification(远程通知)和 Local Notification(本地通知)。过去那些杂乱的和通知相关的 API 都被统一,同时也新增了许多新功能。

2,新特性

UserNotifications 框架除了整合通知相关的 API,还增加了很多令人惊喜的特性,让我们实现许多过去没法实现的功能。

更加丰富的推送内容:现在可以设置推送的 title、subtitle、body 以及符合大小的图片、音频、视频等附件内容。

更好的通知管理:过去已发出的通知不能更新。现在可以对通知进行查看、更新、删除了(哪怕是已展示通知)。

更优雅的展示方式:可以设置应用在前台展示通知,自定义通知 UI。

3,使用流程

UserNotifications 框架的使用大概分为以下几个过程:

申请、注册通知:首先需要向用户请求通知权限,在取得权限后注册通知。

创建、发送通知:然后创建一个通知并发起推送。对于远程推送 APNS 而言,还需要注册 DeviceToken。

展示、处理通知:在接收到推送通知后可以根据 app 的运行情况决定是否展示通知,当然也可以通过一系列的回调接口对通知进行处理加工。

二、通知权限说明

1,申请权限

(1)iOS 10 统一了推送权限的申请。不管是本地推送,还是远程推送,只需要 UNUserNotificationCenter.current().requestAuthorization() 方法申请即可。(这里我们在 AppDelegate 中申请通知权限。当然写在其它地方也是可以的。)

import UIKit

import UserNotifications

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

  func application(_ application: UIApplication, didFinishLaunchingWithOptions

        launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        //请求通知权限

        UNUserNotificationCenter.current()

            .requestAuthorization(options: [.alert, .sound, .badge]) {

                (accepted, error) in

                if !accepted {

                    print("用户不允许消息通知。")

                }

        }


        return true

    }

}

(2)当第一次调用上面这个方法时,系统会弹出如下窗口询问用户是否授权。

(3)如果用户拒绝了这个请求,再次调用该方法也不会再进行弹窗,同时也就无法收到通知。这种情况如果想要应用能接收到通知的话,只能让用户自行前往系统的设置中手动为你的应用打开通知了。因此在合适的时候弹出请求窗,并预先进行说明是很重要的。

2,判断权限

(1)在有些情况下,我们可以对推送权限设置进行检查。比如在检测到用户把通知权限关闭的时候,弹出个提示框引导用户去系统设置中打开通知权限。

    比如下面代码,用户如果点击了“设置”按钮,则会自动跳转到通知设置页面,方便用户设置。

UNUserNotificationCenter.current().getNotificationSettings {

    settings in

    switch settings.authorizationStatus {

    case .authorized:

        return

    case .notDetermined:

        //请求授权

        UNUserNotificationCenter.current()

            .requestAuthorization(options: [.alert, .sound, .badge]) {

                (accepted, error) in

                if !accepted {

                    print("用户不允许消息通知。")

                }

        }

    case .denied:

        DispatchQueue.main.async(execute: { () -> Void in

            let alertController = UIAlertController(title: "消息推送已关闭",

                                        message: "想要及时获取消息。点击“设置”,开启通知。",

                                        preferredStyle: .alert)


            let cancelAction = UIAlertAction(title:"取消", style: .cancel, handler:nil)


            let settingsAction = UIAlertAction(title:"设置", style: .default, handler: {

                (action) -> Void in

                let url = URL(string: UIApplicationOpenSettingsURLString)

                if let url = url, UIApplication.shared.canOpenURL(url) {

                    if #available(iOS 10, *) {

                        UIApplication.shared.open(url, options: [:],

                                                  completionHandler: {

                                                    (success) in

                        })

                    } else {

                        UIApplication.shared.openURL(url)

                    }

                }

            })


            alertController.addAction(cancelAction)

            alertController.addAction(settingsAction)


            self.present(alertController, animated: true, completion: nil)

        })

    }

}

(2)除了打开和关闭全部通知权限外,用户也可以限制应用只能进行哪种形式的通知显示,比如:只允许横幅,而不允许声音及通知中心显示等。这些细微的设置,我们程序也是能检测到的。 

UNUserNotificationCenter.current().getNotificationSettings {

    settings in

    var message = "是否允许通知:"

    switch settings.authorizationStatus {

    case .authorized:

        message.append("允许")

    case .notDetermined:

        message.append("未确定")

    case .denied:

        message.append("不允许")

    }


    message.append("\n声音:")

    switch settings.soundSetting{

    case .enabled:

        message.append("开启")

    case .disabled:

        message.append("关闭")

    case .notSupported:

        message.append("不支持")

    }


    message.append("\n应用图标标记:")

    switch settings.badgeSetting{

    case .enabled:

        message.append("开启")

    case .disabled:

        message.append("关闭")

    case .notSupported:

        message.append("不支持")

    }


    message.append("\n在锁定屏幕上显示:")

    switch settings.lockScreenSetting{

    case .enabled:

        message.append("开启")

    case .disabled:

        message.append("关闭")

    case .notSupported:

        message.append("不支持")

    }


    message.append("\n在历史记录中显示:")

    switch settings.notificationCenterSetting{

    case .enabled:

        message.append("开启")

    case .disabled:

        message.append("关闭")

    case .notSupported:

        message.append("不支持")

    }


    message.append("\n横幅显示:")

    switch settings.alertSetting{

    case .enabled:

        message.append("开启")

    case .disabled:

        message.append("关闭")

    case .notSupported:

        message.append("不支持")

    }


    message.append("\n显示预览:")

    switch settings.showPreviewsSetting{

    case .always:

        message.append("始终(默认)")

    case .whenAuthenticated:

        message.append("解锁时")

    case .never:

        message.append("从不")

    }

    print(message)

}

原文出自:www.hangge.com  转载请保留原文链接:https://www.hangge.com/blog/cache/detail_1845.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354