在iOS 10.0之前apple还没有将通知功能单独拿出来自成一系.而从10.0开始原来的本地通知仍然可用,只是被标记为过时.于是乎我们可以使用10.0全新的通知功能.别急…让我们慢慢来,先从iOS 10.0之前的本地通知讲起吧 ;)

这里不会面面俱到,因为不是面向初学者.如果你有一定的iOS开发经验相信可以很快掌握知识要点.如果是初学者也没关系,你可以在本篇blog后面直接提问,如有时间我会为你解答.

iOS < 10.0

我们首先要取得访问权限:

let notificationSettings = UIUserNotificationSettings(types: [.alert,.badge,.sound], categories: nil)
        UIApplication.shared.registerUserNotificationSettings(notificationSettings)

接下来是发送本地通知:

@IBAction func scheduleLocal(_ sender: AnyObject) {
        //如果取不到当前通知的设置数据则直接退出
        guard let settings = UIApplication.shared.currentUserNotificationSettings else{
            return
        }

        //如果用户权限为.none则提示用户未授权
        if settings.types == UIUserNotificationType(rawValue: 0){
            let ac = UIAlertController(title: "Can't schedule", message: "Either we don't have permission to schedule notifications, or we haven't asked yet.", preferredStyle: .alert)
            ac.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            present(ac, animated: true, completion: nil)
            return
        }

        //开始设置本地通知
        let notification = UILocalNotification()
        notification.fireDate = Date(timeIntervalSinceNow: 20)
        notification.alertBody = "Hey you! Yeah you! Swipe to unlock!"
        notification.alertAction = "be awesome!"
        notification.soundName = UILocalNotificationDefaultSoundName
        notification.userInfo = ["CustomField1":"w00t"]
        //发送本地通知
        UIApplication.shared.scheduleLocalNotification(notification)

    }

最后是本地通知的接收,这分为两种情况:

  1. 通知到达时App未退出
  2. 通知到达时App已退出

对于第一种情况我们实现以下方法来接收处理通知:

func application(_ application: UIApplication, didReceive notification: UILocalNotification) {
        if let userInfo = notification.userInfo{
            let customField1 = userInfo["CustomField1"] as! String
            print("\(#function) recive a notification: customField1 is \(customField1)")

        }
    }

而对于后者我们在didFinishLaunchingWithOptions方法中处理通知:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        if let options = launchOptions{
            if let notification = options[UIApplicationLaunchOptionsKey.localNotification] as? UILocalNotification{
                if let userInfo = notification.userInfo{
                    let customField1 = userInfo["CustomField1"] as! String
                    print("when App did launch,recive a noficition:customField1 is \(customField1)")

                    //do anything you want!!!
                }
            }
        }

        return true
    }

iOS >= 10.0

在iOS 10.0中apple为通知添加了单独的框架UserNotifications,一切通知都要围绕它打交道哦.

首先同样是询问用户访问权限:

@IBAction func regNotification(_ sender: AnyObject) {
        if #available(iOS 10.0, *){

            let center = UNUserNotificationCenter.current()

            center.getNotificationSettings {settings in
                print(settings)
            }

            center.requestAuthorization(options: [.alert,.sound]) {(granted,error) in

                if let err = error{
                    self.msg(title: "Error", string: "本地通知授权时发生了错误:\(err.localizedDescription)")
                }else if !granted{
                    self.msg(title: "Error", string: "你没有获得本地通知的许可")
                }
            }
        }
    }

接着你需要设置通知中心的委托,我把它放在didFinishLaunchingWithOptions方法中:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        let center = UNUserNotificationCenter.current()
        center.delegate = self

        return true
    }

注意这里didFinishLaunchingWithOptions方法已不再处理本地通知,在iOS 10.0中所有的通知接收处理都放在一个地方,无论App是运行还是退出,这个后面会说到.

接下来是发送本地通知:

@IBAction func sendNotification(_ sender: AnyObject) {
        let center = UNUserNotificationCenter.current()
        let content = UNMutableNotificationContent()
        content.title = "Hello!"
        content.body = "你好世界!!!"
        content.sound = UNNotificationSound.default()
        content.userInfo = ["key0":"value0"]

        //content.badge = NSNumber(value: UIApplication.shared.applicationIconBadgeNumber + 1)
        content.categoryIdentifier = "com.hopy.localNotification"

        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5.0, repeats: false)
        let request = UNNotificationRequest(identifier: "FiveSecond", content: content, trigger: trigger)
        center.add(request){[unowned self] error in
            if let err = error{
                self.msg(title: "ERROR", string: "NotificationCenter add N failed:\(err.localizedDescription)")
            }else{
                //do anything you want!
            }
        }
    }

最后是本地通知的接收,我们为AppDelegate添加UNUserNotificationCenterDelegate协议,然后实现如下方法:

//在展示通知前进行处理,有机会在展示通知前再修改通知内容
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        //do any stuff!!
        completionHandler(UNNotificationPresentationOptions.alert)
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

        let notification = response.notification
        notificationInfo = notification.request.content.userInfo
        //do any stuff!!!

        completionHandler()
    }

iOS 10.0之前和之后的Local Notification有神马不同的更多相关文章

  1. iOS 10.0 更新点(开发者视角)

    html, body {overflow-x: initial !important;}html { font-size: 14px; } body { margin: 0px; padding: 0 ...

  2. 在 iOS 10.0 之后, App 要调用手机相机与相簿应注意的事项

    iOS 的 SDK 每一年至少都会有一次大改版,从 2009 到 2016 年,版号已经到了第 10 版了,很轻易的就追上了 Mac OSX. 每一次的大改版都会有不少新的功能或新的规范,在 iOS ...

  3. iOS 10.0前的Notification推送

    前言 推送为远程推送,一般由苹果APNS服务器发送给苹果设备(iPhone,iPad) 推送分在前台和后台.在前台时 用户可以在application 的代理回调接口中做相应处理:在后台时 系统会全权 ...

  4. iOS 10.0适配之旅

    1.升级Xcode体验 升级到Xcode之后,调试程序好多东西都不是太适应 控制台莫名给你打印一堆不是太好理解的东西 之前使用 Alcatraz 下载的插件都不能用(如何使用Alcatraz) 打开麦 ...

  5. 关于iOS10 Xcode8真机测试项目出现的问题 "code signing is required for product type 'xxxxx' in SDK 'iOS 10.0"..

    昨天用真机测试项目出现这样的错误,在网上搜集了一些信息,所以将自己的经验分享出来帮助更多的人. 第一步: 检查你的1和2是否填写正确,如果你是运行别人的项目,BundleIdentifier要和你的X ...

  6. [转载]iOS 10 UserNotifications 框架解析

    活久见的重构 - iOS 10 UserNotifications 框架解析 TL;DR iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...

  7. iOS 10 UserNotifications 框架解析

    摘自:https://onevcat.com/2016/08/notification/ iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifica ...

  8. 第三十二篇、iOS 10开发

    1.语音识别 苹果官方在文档中新增了API   Speech,那么在以前我们处理语音识别非常的繁琐甚至很多时候可能需要借助于第三方框架处理,那么苹果推出了这个后,我们以后处理起来就非常的方便了,spe ...

  9. iOS 10、Xcode 8 遇到部分问题解决记录

    今天把iphone 6 升级到ios10 后,用Xcode 7进行真机调试的时候提示: Could not find Developer Disk Image 果断准备升级到Xcode 8 .但是想保 ...

随机推荐

  1. ubuntu安装IBM DB2 Express-C

    去 官网 下载DB2对应Linux下的安装包和语言包.

  2. 重拾Python(4):Pandas之DataFrame对象的使用

    Pandas有两大数据结构:Series和DataFrame,之前已对Series对象进行了介绍(链接),本文主要对DataFrame对象的常用用法进行总结梳理. 约定: import pandas ...

  3. [LeetCode] String Compression 字符串压缩

    Given an array of characters, compress it in-place. The length after compression must always be smal ...

  4. [LeetCode] Remove Comments 移除注释

    Given a C++ program, remove comments from it. The program source is an array where source[i] is the ...

  5. 【linux之crontab,启动】

    一.计划任务 atd at命令发布的任务计划 一次性的任务计划 at time ctrl+d 提交 time: 1.绝对时间:12:00 2.相对时间:+8 3.模糊时间:noon midnight ...

  6. 我们为什么要用springcloud?

    1 2 单体架构 在网站开发的前期,项目面临的流量相对较少,单一应用可以实现我们所需要的功能,从而减少开发.部署和维护的难度.这种用于简单的增删改查的数据访问框架(ORM)十分的重要.  垂直应用架构 ...

  7. [Codeforces 946D]Timetable

    Description 题库链接 给你一个 \(N\times M\) 的 \(01\) 矩阵,你可以从中将一些 \(1\) 变为 \(0\) ,最多 \(K\) 次.使操作之后使得每行最远的 \(1 ...

  8. ●BZOJ 3963 [WF2011]MachineWorks

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3963 题解: 斜率优化DP,CDQ分治. 先按时间排序.(规定以下内容的第i台机器的卖出时间 ...

  9. [BZOJ]1027 合金(JSOI2007)

    不知道该如何评价吧,很神的一道题,就算是10年前的题目也不可小觑啊. Description 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁 ...

  10. bzoj2683简单题 cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1803  Solved: 731[Submit][Status][Discuss] ...