在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. Python进阶_mysql(1)

    什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 进入mysql (linux ...

  2. java中的内部类概念

    内部类和外部类可以互相访问私有属性 1.普通内部类实例化方式 外部类.内部类 对象 = new 外部类().new 内部类(); class Outer{//外部类 private String ms ...

  3. [LeetCode] Minimum Factorization 最小因数分解

    Given a positive integer a, find the smallest positive integer b whose multiplication of each digit ...

  4. [LeetCode] Complex Number Multiplication 复数相乘

    Given two strings representing two complex numbers. You need to return a string representing their m ...

  5. django 模板继承与重写

    1.模板的继承一般用在别人给我们做好的HTML页面,当我们发现有很多的页面都具有相同的部分,这会我们应该考虑怎么能把他们相同的部分给提取出来,提取出来的部分我们作为一个单独的HTML文件叫做base. ...

  6. 机器学习技法:05 Kernel Logistic Regression

    Roadmap Soft-Margin SVM as Regularized Model SVM versus Logistic Regression SVM for Soft Binary Clas ...

  7. [BZOJ 4916]神犇和蒟蒻

    Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你 ...

  8. [ZJOI 2007]时态同步

    Description 小Q在电子工艺实习课上学习焊接电路板.一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号.电路板的各个节点由若干不相交的导线相连接,且对于电路板 ...

  9. LOJ #6031 字符串

    Description Solution 当 \(k\) 值较小时,发现询问串比较多,串长比较小 然后对 \(Q\) 个询问区间离线跑莫队,一次考虑每一个区间的贡献 假设一个区间 \([i,j]\) ...

  10. Codeforces 547D Mike and Fish

    Description 题面 题目大意:有一个的网格图,给出其中的 \(n\) 个点,要你给这些点染蓝色或红色,满足对于每一行每一列都有红蓝数量的绝对值之差不超过1 Solution 首先建立二分图, ...