iOS |关于通知中心

2,721 阅读7分钟

前言

通知中心是iOS中强大的功能之一,它允许应用程序在后台或前台发送通知,以便向用户传递重要信息。本文将介绍iOS中的通知中心的基本概念和用法,并探讨如何创建和处理自定义通知。

一、通知中心是什么

iOS 的通知中心是一个系统级别的功能,用于集中管理和显示各种通知,包括来自应用程序、系统和其他来源的通知。可以把它理解为一个集中管理和传递通知的系统组件。这个组件允许应用程序在不同的情况下发送通知,例如当应用程序处于后台或前台时,或者当特定事件发生时。这个组件提供了一个统一的界面,让用户查看和处理通知。

通知中心可以用于多种用途,例如:

  • 提醒用户进行操作或查看重要信息。
  • 通知用户关于应用程序的状态变化,例如下载完成、网络连接状态变化等。
  • 在应用程序之间进行通信和数据传递。

二、通知分类

在 iOS 中,不同的通知分类可以以不同的样式和交互方式显示,我们可以通过指定通知的分类,定制不同的按钮、操作和样式,提供更富有吸引力和有用的通知体验。

常见的 iOS 通知分类有:

  • 基本通知分类(Default Notification Category):这是默认的通知分类,用于显示普通的文本通知。它可以包含一个标题、副标题和正文,并提供默认的通知按钮,如 "查看" 或 "忽略"。

  • 按钮通知分类(Button Notification Category):这种分类允许你在通知中添加自定义按钮。例如,你可以在通知中添加 "喜欢"、"分享" 或 "回复" 等按钮,以便用户可以直接在通知中执行相关操作。

  • 文本输入通知分类(TextInput Notification Category):通过使用文本输入分类,你可以在通知中添加一个文本输入框,以便用户可以直接在通知中输入文本。这对于实现快速回复功能非常有用。

  • 图像通知分类(Image Notification Category):这种分类允许你在通知中显示图片。你可以在通知中添加一个大图像,以提供更具吸引力的通知体验。

  • 进度通知分类(Progress Notification Category):这种分类用于显示带有进度条的通知。你可以在通知中显示一个进度指示器,以向用户展示某个任务的进展情况,例如文件下载或上传进度。

上面只是列举了一些常见的通知分类,详细定制的要求你可以查看 User Notifications 框架(UNNotificationCategoryUNNotificationAction)来进行定义和使用。

三、使用通知中心发送系统通知

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)的通知来通知用户,远程通知在以下情况下非常有用:

  • 为即时聊天、社交媒体互动提供实时通知和即时反馈。

  • 根据用户的兴趣、行为或位置等信息推送个性化和定制通知,引起用户兴趣,有助于提高用户参与度和体验,并增强应用的粘性。

  • 可以用于发送重要事件和提醒,例如日程安排、会议通知、提醒付款、航班时间变更等。

  • 当你的应用程序有新功能或推广活动时,可以用远程通知通知用户并促使他们打开应用程序,提高用户转化率。

  • 远程通知可以触发应用程序在后台进行处理,这时可以从服务器拉取数据、执行后台任务、更新应用程序内容等。

远程通知在很多需要及时通知更新的场景下非常有用,但使用时应注意用户隐私和通知滥用的问题,确保通知合规、频率正常。

设置远程通知的步骤如下:

  1. 在Xcode中打开你的项目,并确保你的应用程序已经正确配置了推送通知的证书。
  2. 在AppDelegate文件中,导入UserNotifications框架。
  3. 在AppDelegate类中,获取通知授权后,注册应用程序的远程通知设置(主线程):
dispatch_async(dispatch_get_main_queue(), ^{
      [[UIApplication sharedApplication] registerForRemoteNotifications];
});

四、通知响应流程

当用户点击本地通知,触发的代码流程如下:

  1. 如果应用程序尚未运行,则首先触发AppDelegate中的didFinishLaunchingWithOptions方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions API_AVAILABLE(ios(3.0)); 
  1. 如果应用程序正在运行/第一步执行完毕,则触发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


当用户点击远程通知,触发的代码流程如下::
  1. 如果应用程序尚未运行,则首先触发AppDelegate中的didFinishLaunchingWithOptions方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions API_AVAILABLE(ios(3.0)); 
  1. 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通知中心的工作,通知的分类以及如何使用通知,还有很多相关的更细知识点可能没有讨论到,欢迎评论提问,我们一起讨论。