美文网首页iOS-swift
iOS 10 本地通知UserNotifications Swi

iOS 10 本地通知UserNotifications Swi

作者: Yuency | 来源:发表于2018-09-13 11:39 被阅读18次

    前言

    以前嘛,公司要重做一个 App。正好有击费接触 iOS 本地通知,以前从来都没有玩过的。然而在我还没研究透彻的时候,就跑路了。出来混,迟早要还的。

    示例代码:https://github.com/gityuency/ExtensionSample

    第一步, Command + C

    import UIKit
    import UserNotifications
    
    /// 通知的 Category 需要一个 ID, 这个 ID 在自定义通知 UI 的时候会用到.
    private let categoryid = "categoryid"
    
    @available(iOS 10.0, *)
    class iOS10UserNotificationViewController: UIViewController, UNUserNotificationCenterDelegate {
        
        deinit {
            print("销毁了..")
        }
        
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            UIApplication.shared.applicationIconBadgeNumber = 0
        }
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            let b = UIButton(frame: view.bounds);
            b.setTitle("3秒钟之后发送通知", for: .normal)
            b.setTitleColor(UIColor.red, for: .normal)
            b.addTarget(self, action: #selector(send), for: .touchUpInside)
            view.addSubview(b)
            
            // 1. 注册通知权限
            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound, .carPlay]) { (success, error) in
                print("iOS 10+ 通知授权" + (success ? "成功" : "失败"))
            }
            
            // 2. 设置交互
            let replayAction = UNTextInputNotificationAction(identifier: "replayAction", title: "立即回复", options: [])
            let enterAction = UNNotificationAction(identifier:"enterAction",title: "进入会话",options: .foreground)
            let stopAction = UNNotificationAction(identifier:"stopAction",title: "关闭",options: .destructive)
            let categroy = UNNotificationCategory(identifier: categoryid,actions: [replayAction, enterAction, stopAction],intentIdentifiers: [],options: UNNotificationCategoryOptions(rawValue: 0))
            UNUserNotificationCenter.current().setNotificationCategories([categroy])
         
            // 3.设置通知代理,用于检测交互点击方法
            UNUserNotificationCenter.current().delegate = self;
        }
        
        @objc func send() {
            
            //4. 设置本地通知相关的属性 // 应该使用UNNotificationContent的子类来进行设定
            let content = UNMutableNotificationContent() //iOS 10
            
            // 设置应用程序的数字角标
            content.badge = 1
            
            // 设置声音
            content.sound = UNNotificationSound.default()
            
            // 设置内容
            content.title = "小怡"
            content.subtitle = "给你发了一条消息"
            content.body =
            """
            晚风的声音
            带走你曾经的曾经
            我化作人鱼
            只有七秒钟的记忆
            不经意的思念是那么痛
            痛到回忆根本不敢触碰
            岁月带不走痛 是习惯了痛
            你有恃无恐
            """
            
            //5. 设置附件 可以是 音频 视频 图片 大小有限制
            let path = URL(fileURLWithPath: Bundle.main.path(forResource: "icon1.jpg", ofType: nil)!)
            let att = try! UNNotificationAttachment(identifier: "icon", url: path, options: nil)
            content.attachments = [att]
            
            //6. 设置触发时间及重复 用UNNotificationTrigger的子类实现
            /*
             UNPushNotificationTrigger
             UNTimeIntervalNotificationTrigger
             UNCalendarNotificationTrigger
             UNLocationNotificationTrigger
             */
            //TimeInterval: 发送通知的时间 repeats: 设置重复
            let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)
            
            //将categroy赋值到通知内容上
            content.categoryIdentifier = categoryid;
            
            
            //7.设置通知请求
            //Identifier: 通知的标示符, 用于区分不同的本地通知的
            //content: 相当于以前的设置本地通知属性的步骤  trigger: 设置触发时间及重复的类
            let request = UNNotificationRequest(identifier: "local", content: content, trigger: trigger)
            
            
            //8. 通过用户通知中心来添加一个本地通知的请求
            UNUserNotificationCenter.current().add(request) { (error) in
                if error == nil {
                    print("通知完成 \(content)")
                }
            }
        }
        
        //MARK: 通知代理
        func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
            
            print("收到了点击事件 \(response)")
        }
    }
    

    第二步, Command + R

    顶部通知.png 展开通知.png

    然而。我们已经可以自定义通知UI了。如何实现自定义本地通知的 UI?

    第一步,做好如下工作:

    1. 在Xcode中File→New→Targe

    2. Notification Content对应的是通知,Notification Service Extension对应的是推送。

    3. 选择Notification Content


      选择.png
    4. 配置 info.plist 文件, 把 "UNNotificationExtensionCategory" 字段值改为你在代码里定义的 Category ID。


      配置 id.png
    5. 打开MainInterface.storyboard,开始你的布局表演。


      布局.png

    第二步, Command + R

    效果图.png

    感谢以下 iOS 玩家

    iOS10本地通知UserNotifications快速入门
    ios10本地通知
    iOS10 User Notificaitons学习笔记
    活久见的重构-iOS10 UserNotificaiotns框架解析
    iOS 官方示例代码

    相关文章

      网友评论

        本文标题:iOS 10 本地通知UserNotifications Swi

        本文链接:https://www.haomeiwen.com/subject/kzqwgftx.html