本地通知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:@""];
}

 

posted @ 2023-02-03 15:13  码出境界  阅读(422)  评论(0编辑  收藏  举报