前言
以前嘛,公司要重做一个 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?
第一步,做好如下工作:
-
在Xcode中File→New→Targe
-
Notification Content对应的是通知,Notification Service Extension对应的是推送。
-
选择Notification Content
选择.png -
配置 info.plist 文件, 把 "UNNotificationExtensionCategory" 字段值改为你在代码里定义的 Category ID。
配置 id.png -
打开MainInterface.storyboard,开始你的布局表演。
布局.png
第二步, Command + R
效果图.png感谢以下 iOS 玩家
iOS10本地通知UserNotifications快速入门
ios10本地通知
iOS10 User Notificaitons学习笔记
活久见的重构-iOS10 UserNotificaiotns框架解析
iOS 官方示例代码
网友评论