


import UIKit
import UserNotifications
//通知category标识符枚举
enum NotificationCategory: String {
case news //新闻资讯通知category
}
//通知category的action标识符枚举
enum NotificationCategoryAction: String {
case like
case cancel
case comment
}
//通知响应对象
class NotificationHandler: NSObject, UNUserNotificationCenterDelegate {
//对通知进行响应(用户与通知进行交互时被调用)
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler:
@escaping () -> Void) {
//根据category标识符做相应的处理
let categoryIdentifier = response.notification.request.content.categoryIdentifier
if let category = NotificationCategory(rawValue: categoryIdentifier) {
switch category {
case .news:
handleNews(response: response)
}
}
completionHandler()
}
//处理新闻资讯通知的交互
private func handleNews(response: UNNotificationResponse) {
let message: String
//判断点击是那个action
if let actionType = NotificationCategoryAction(rawValue: response.actionIdentifier) {
switch actionType {
case .like: message = "你点击了“点个赞”按钮"
case .cancel: message = "你点击了“取消”按钮"
case .comment:
message = "你输入的是:\((response as! UNTextInputNotificationResponse).userText)"
}
} else {
//直接点击通知,或者点击删除这个通知会进入这个分支。
message = ""
}
//弹出相关信息
if !message.isEmpty {
showAlert(message: message)
}
}
//在根视图控制器上弹出普通消息提示框
private func showAlert(message: String) {
if let vc = UIApplication.shared.keyWindow?.rootViewController {
let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "确定", style: .cancel))
vc.present(alert, animated: true)
}
}
}
mport UIKit
import UserNotifications
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
let notificationHandler = NotificationHandler()
func application(_ application: UIApplication, didFinishLaunchingWithOptions
launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//请求通知权限
UNUserNotificationCenter.current()
.requestAuthorization(options: [.alert, .sound, .badge]) {
(accepted, error) in
if !accepted {
print("用户不允许消息通知。")
}
}
//注册category
registerNotificationCategory()
UNUserNotificationCenter.current().delegate = notificationHandler
return true
}
func applicationWillResignActive(_ application: UIApplication) {
}
func applicationDidEnterBackground(_ application: UIApplication) {
}
func applicationWillEnterForeground(_ application: UIApplication) {
}
func applicationDidBecomeActive(_ application: UIApplication) {
}
func applicationWillTerminate(_ application: UIApplication) {
}
//注册一个category
private func registerNotificationCategory() {
let newsCategory: UNNotificationCategory = {
//创建输入文本的action
let inputAction = UNTextInputNotificationAction(
identifier: NotificationCategoryAction.comment.rawValue,
title: "评论",
options: [.authenticationRequired],
textInputButtonTitle: "发送",
textInputPlaceholder: "在这里留下你想说的话...")
//创建普通的按钮action
let likeAction = UNNotificationAction(
identifier: NotificationCategoryAction.like.rawValue,
title: "点个赞",
options: [.foreground])
//创建普通的按钮action
let cancelAction = UNNotificationAction(
identifier: NotificationCategoryAction.cancel.rawValue,
title: "取消",
options: [.destructive])
//创建category
return UNNotificationCategory(identifier: NotificationCategory.news.rawValue,
actions: [inputAction, likeAction, cancelAction],
intentIdentifiers: [], options: [.customDismissAction])
}()
//把category添加到通知中心
UNUserNotificationCenter.current().setNotificationCategories([newsCategory])
}
}
import UIKit
import UserNotifications
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//设置推送内容
let content = UNMutableNotificationContent()
content.title = "hangge.com"
content.body = "囤积iPhoneX的黄牛赔到怀疑人生?"
//设置通知对应的category标识符
content.categoryIdentifier = NotificationCategory.news.rawValue
//设置通知触发器
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
//设置请求标识符
let requestIdentifier = "com.hangge.testNotification"
//设置一个通知请求
let request = UNNotificationRequest(identifier: requestIdentifier,
content: content, trigger: trigger)
//将通知请求添加到发送中心
UNUserNotificationCenter.current().add(request) { error in
if error == nil {
print("Time Interval Notification scheduled: \(requestIdentifier)")
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
{
"aps":{
"alert":{
"title":"hangge.com",
"body":"囤积iPhoneX的黄牛赔到怀疑人生?"
},
"sound":"default",
"badge":1,
"category":"news"
}
}