本地通知UserNotifications的简单使用
有三个概念要区分下:
(1)通知中心:这个是语法中的设计模式,一对多的广播通知,代码中订阅了该通知的监听者可以接受此通知进行处理
(2)远程通知:也可以说是APNs通知,极光推送等,一般指的是远程通知,使用服务器进行通知。这类通知会出现在「手机通知栏」中
(3)本地通知:比如手机中设置的闹铃时间到了,不需要使用服务器。这类通知会出现在「手机通知栏」中
本文讲的就是第三点,本地通知的使用。
第一步:导入头文件声明、遵守协议
#import <UserNotifications/UserNotifications.h>
<UNUserNotificationCenterDelegate>
第二步:初始化通知管理类获取通知权限
// 使用 UNUserNotificationCenter 来管理通知 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; // iOS 10 使用以下方法注册,才能得到授权 [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) { //在block中会传入布尔值granted,表示用户是否同意 if (granted) { //如果用户申请权限成功,则可以设置通知中心的代理 [UNUserNotificationCenter currentNotificationCenter].delegate = self; } }];
第三步:创建添加通知的方法
- (void)addLocalNotification:(NSString *)title subtitle:(NSString *)subtitle body:(NSString *)body { //通知内容类 UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init]; //设置通知请求发送时APP图标上显示的数字 content.badge = @0; //设置通知的标题 content.title = title; //设置通知的副标题 content.subtitle = subtitle; //设置通知的内容 content.body = body; //设置通知提示音 content.sound = [UNNotificationSound defaultSound]; //设置从通知激活App时的lanunchImage图片 content.launchImageName = @"lanunchImage"; //设置触发器 //1-计时器触发器:ns后执行 UNTimeIntervalNotificationTrigger *timrTrigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:0.1 repeats:NO]; //2-周期日历触发器 /* NSDateComponents *components = [[NSDateComponents alloc] init]; components.year = 2019; components.month = 11; components.day = 2; UNCalendarNotificationTrigger *calendarTrigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:NO]; //3-地域触发器 CLRegion *region = [[CLCircularRegion alloc] initWithCenter:CLLocationCoordinate2DMake(33.0, 110.0) radius:100 identifier:@"region"]; UNLocationNotificationTrigger *locationTrigger = [UNLocationNotificationTrigger triggerWithRegion:region repeats:NO]; */ //设置通知请求 //⚠️如果使用相同的「requestWithIdentifier」会一直覆盖之前的旧通知 NSString *requestIdentifer = [NSString stringWithFormat:@"TestRequestww1%u",arc4random() % 1000]; UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifer content:content trigger:timrTrigger]; //添加通知请求 [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { if (!error) { NSLog(@"增加一条本地通知"); } }]; }
第四步:处理通知的delegate方法
/* 仅当应用程序在前台时,才会调用该方法。 如果未实现该方法或未及时调用该处理程序,则不会显示该通知。 应用程序可以选择将通知显示为声音,徽章,警报和/或显示在通知列表中。 该决定应基于通知中的信息是否对用户可见。 */ - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler { NSLog(@"------------当前应用在前台,收到了通知消息----------------"); completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionSound | UNNotificationPresentationOptionAlert); } /* 当接收到通知后,在用户点击通知激活应用程序时调用这个方法,无论是在前台还是后台 */ - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler { NSLog(@"------------当前应用无论是在前台还是后台,收到了通知消息,用户点击该消息----------------"); completionHandler(); }
第五步:在需要的时候发送本地通知,比如:
/// 已经进入后台 - (void)applicationDidEnterBackground:(UIApplication *)application { NSLog(@"APP生命周期:已经进入后台:%s",__func__); [self addLocalNotification:@"APP生命周期" subtitle:@"已经进入后台" body:@""]; }