前言
通知中心是iOS中强大的功能之一,它允许应用程序在后台或前台发送通知,以便向用户传递重要信息。本文将介绍iOS中的通知中心的基本概念和用法,并探讨如何创建和处理自定义通知。
一、通知中心是什么
iOS 的通知中心是一个系统级别的功能,用于集中管理和显示各种通知,包括来自应用程序、系统和其他来源的通知。可以把它理解为一个集中管理和传递通知的系统组件。这个组件允许应用程序在不同的情况下发送通知,例如当应用程序处于后台或前台时,或者当特定事件发生时。这个组件提供了一个统一的界面,让用户查看和处理通知。
通知中心可以用于多种用途,例如:
- 提醒用户进行操作或查看重要信息。
- 通知用户关于应用程序的状态变化,例如下载完成、网络连接状态变化等。
- 在应用程序之间进行通信和数据传递。
二、通知分类
在 iOS 中,不同的通知分类可以以不同的样式和交互方式显示,我们可以通过指定通知的分类,定制不同的按钮、操作和样式,提供更富有吸引力和有用的通知体验。
常见的 iOS 通知分类有:
-
基本通知分类(Default Notification Category):这是默认的通知分类,用于显示普通的文本通知。它可以包含一个标题、副标题和正文,并提供默认的通知按钮,如 "查看" 或 "忽略"。
-
按钮通知分类(Button Notification Category):这种分类允许你在通知中添加自定义按钮。例如,你可以在通知中添加 "喜欢"、"分享" 或 "回复" 等按钮,以便用户可以直接在通知中执行相关操作。
-
文本输入通知分类(TextInput Notification Category):通过使用文本输入分类,你可以在通知中添加一个文本输入框,以便用户可以直接在通知中输入文本。这对于实现快速回复功能非常有用。
-
图像通知分类(Image Notification Category):这种分类允许你在通知中显示图片。你可以在通知中添加一个大图像,以提供更具吸引力的通知体验。
-
进度通知分类(Progress Notification Category):这种分类用于显示带有进度条的通知。你可以在通知中显示一个进度指示器,以向用户展示某个任务的进展情况,例如文件下载或上传进度。
上面只是列举了一些常见的通知分类,详细定制的要求你可以查看 User Notifications 框架(UNNotificationCategory 和 UNNotificationAction)来进行定义和使用。
三、使用通知中心发送系统通知
iOS提供了一个简单的方式来发送系统通知,我们也叫本地通知(Local Notification),这种通知是加入到系统级别的数据库中,即使用户进入飞行模式,或者重启手机,当到了设定的通知触发时间,就会触发系统的通知中心,通知到用户。
系统通知的创建和发送使用的是UNUserNotificationCenter类和相关API可以实现,示例代码如下:
// 导入需要的框架
#import <UserNotifications/UserNotifications.h>
// 发送系统通知的方法
- (void)sendSystemNotification {
// 创建通知内容
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.title = @"系统通知标题";
content.body = @"这是一条系统通知的内容";
content.sound = [UNNotificationSound defaultSound];
// 创建通知触发器
UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO]; // 5秒后触发通知
// 创建通知请求
NSString *identifier = @"SystemNotificationIdentifier";
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier content:content trigger:trigger];
// 添加通知请求到通知中心
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
if (error) {
NSLog(@"发送系统通知失败: %@", error);
} else {
NSLog(@"系统通知发送成功");
}
}];
}
// 在适当的位置调用以上方法即可发送系统通知。
上述代码中,我们首先导入了 UserNotifications 框架,创建了一个 UNMutableNotificationContent 对象,设置了通知的标题、内容和铃声等属性。然后,我们创建了一个 UNTimeIntervalNotificationTrigger 对象,将通知触发时间设置为5分钟后,并创建了一个 UNNotificationRequest 对象,将通知内容和触发器对象添加到其中。最后,我们使用 UNUserNotificationCenter 类将本地通知请求添加到用户通知中心中。
需要注意的是,在使用 UserNotifications 框架创建本地通知时,我们需要在应用程序中请求用户授权,并获取通知权限。在 iOS 10 及以上版本中,我们可以使用 UNUserNotificationCenter 类来请求用户授权和管理本地通知,示例代码如下:
// 导入 UserNotifications 框架
#import <UserNotifications/UserNotifications.h>
// 请求通知访问授权
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound)
completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!granted) {
NSLog(@"用户未授权通知访问");
}
}];
iOS还提供一种远程通知(Remote Notification)的通知来通知用户,远程通知在以下情况下非常有用:
-
为即时聊天、社交媒体互动提供实时通知和即时反馈。
-
根据用户的兴趣、行为或位置等信息推送个性化和定制通知,引起用户兴趣,有助于提高用户参与度和体验,并增强应用的粘性。
-
可以用于发送重要事件和提醒,例如日程安排、会议通知、提醒付款、航班时间变更等。
-
当你的应用程序有新功能或推广活动时,可以用远程通知通知用户并促使他们打开应用程序,提高用户转化率。
-
远程通知可以触发应用程序在后台进行处理,这时可以从服务器拉取数据、执行后台任务、更新应用程序内容等。
远程通知在很多需要及时通知更新的场景下非常有用,但使用时应注意用户隐私和通知滥用的问题,确保通知合规、频率正常。
设置远程通知的步骤如下:
- 在Xcode中打开你的项目,并确保你的应用程序已经正确配置了推送通知的证书。
- 在AppDelegate文件中,导入UserNotifications框架。
- 在AppDelegate类中,获取通知授权后,注册应用程序的远程通知设置(主线程):
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] registerForRemoteNotifications];
});
四、通知响应流程
当用户点击本地通知,触发的代码流程如下:
- 如果应用程序尚未运行,则首先触发AppDelegate中的
didFinishLaunchingWithOptions方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions API_AVAILABLE(ios(3.0));
- 如果应用程序正在运行/第一步执行完毕,则触发UNUserNotificationCenterDelegate中的
didReceiveNotificationResponse方法,用户可以在该方法中处理接收到的通知,获取通知的内容和相关信息,并执行相应的操作,函数如下:
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler API_AVAILABLE(macos(10.14), ios(10.0), watchos(3.0)) API_UNAVAILABLE(tvos);
需要注意该方法被调用的前提是
- 需要如果你使用了UNUserNotificationCenter来注册通知
- 设置了相应的代理对象,代理是
UNUserNotificationCenterDelegate
当用户点击远程通知,触发的代码流程如下::
- 如果应用程序尚未运行,则首先触发AppDelegate中的
didFinishLaunchingWithOptions方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions API_AVAILABLE(ios(3.0));
- AppDelegate中的
didReceiveRemoteNotification方法,用户可以在该方法中处理接收到的通知,获取通知的内容和相关信息,并执行相应的操作,函数如下:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler API_AVAILABLE(ios(7.0));
iOS接收到远程通知使用的是苹果推送通知服务(Apple Push Notification Service,简称APNs)进行传递,是以特定的格式进行传输和解析的。通常格式如下:
"aps": {
"alert": {
"title": "Notification Title",
"body": "Notification Body"
},
"sound": "default",
"badge": 1
}
-
"aps"字段:这是一个必需字段,包含了与通知相关的信息,如标题、正文和声音等。 -
"sound"字段(可选):通知到达时播放的声音。可以是预设的系统声音,也可以是自定义声音文件。 -
"badge"字段(可选):应用程序图标上显示的通知数字。 -
其他自定义字段:可以在通知负载中添加自定义字段,以满足你的应用程序需求。
五、总结
本文总结了iOS通知中心的工作,通知的分类以及如何使用通知,还有很多相关的更细知识点可能没有讨论到,欢迎评论提问,我们一起讨论。