我们有时候有需要本地通知的功能
本地推送通知也需要申请推送通知权限,具体步骤可看我的上一篇博客(关于推送权限申请)
1、添加本地推送的方法,需要判断iOS10.0和iOS8.0不同的方法
#import <UserNotifications/UserNotifications.h>
/** 添加本地推送通知*/
+ (void)addLocalNotificationWithTitle:(NSString *)title subTitle:(NSString *)subTitle body:(NSString *)body timeInterval:(long)timeInterval identifier:(NSString *)identifier userInfo:(NSDictionary *)userInfo repeats:(int)repeats
{
if (title.length == 0 || body.length == 0 || identifier.length == 0) {
return;
}
if (@available(iOS 10.0, *)) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
// 标题
if (title.length) {
content.title = title;
}
if (subTitle.length) {
content.subtitle = subTitle;
}
// 内容
if (body.length) {
content.body = body;
}
if (userInfo != nil) {
content.userInfo = userInfo;
}
// 声音
// 默认声音
content.sound = [UNNotificationSound defaultSound];
// 添加自定义声音
//content.sound = [UNNotificationSound soundNamed:@"Alert_ActivityGoalAttained_Salient_Haptic.caf"];
// 角标 (我这里测试的角标无效,暂时没找到原因)
content.badge = @1;
// 多少秒后发送,可以将固定的日期转化为时间
NSTimeInterval time = [[NSDate dateWithTimeIntervalSinceNow:timeInterval] timeIntervalSinceNow];
UNNotificationTrigger *trigger = nil;
// repeats,是否重复,如果重复的话时间必须大于60s,要不会报错
if (repeats > 0 && repeats < 7) {
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:timeInterval];
// 定义一个时间字段的旗标,指定将会获取指定年、月、日、时、分、秒的信息
unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitWeekday | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
// 获取不同时间字段的信息
NSDateComponents* comp = [gregorian components:unitFlags fromDate:date];
NSDateComponents *components = [[NSDateComponents alloc] init];
components.second = comp.second;
if (repeats == 6) {
//每分钟循环
} else if (repeats == 5) {
//每小时循环
components.minute = comp.minute;
} else if (repeats == 4) {
//每天循环
components.minute = comp.minute;
components.hour = comp.hour;
} else if (repeats == 3) {
//每周循环
components.minute = comp.minute;
components.hour = comp.hour;
components.weekday = comp.weekday;
} else if (repeats == 2) {
//每月循环
components.minute = comp.minute;
components.hour = comp.hour;
components.day = comp.day;
components.month = comp.month;
} else if (repeats == 1) {
//每年循环
components.minute = comp.minute;
components.hour = comp.hour;
components.day = comp.day;
components.month = comp.month;
components.year = comp.year;
}
trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES];
} else {
//不循环
trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:time repeats:NO];
}
// 添加通知的标识符,可以用于移除,更新等操作 identifier
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier content:content trigger:trigger];
[center addNotificationRequest:request withCompletionHandler:^(NSError *_Nullable error) {
NSLog(@"ECKPushSDK log:添加本地推送成功");
}];
} else {
UILocalNotification *notif = [[UILocalNotification alloc] init];
// 发出推送的日期
notif.fireDate = [NSDate dateWithTimeIntervalSinceNow:timeInterval];
if (title.length > 0) {
notif.alertTitle = title;
}
// 推送的内容
if (body.length > 0) {
notif.alertBody = body;
}
if (userInfo != nil) {
NSMutableDictionary *mdict = [NSMutableDictionary dictionaryWithDictionary:userInfo];
[mdict setObject:identifier forKey:@"identifier"];
notif.userInfo = mdict;
} else {
// 可以添加特定信息
notif.userInfo = @{@"identifier":identifier};
}
// 角标
notif.applicationIconBadgeNumber = 1;
// 提示音
notif.soundName = UILocalNotificationDefaultSoundName;
// 循环提醒
if (repeats == 6) {
//每分钟循环
notif.repeatInterval = NSCalendarUnitMinute;
} else if (repeats == 5) {
//每小时循环
notif.repeatInterval = NSCalendarUnitHour;
} else if (repeats == 4) {
//每天循环
notif.repeatInterval = NSCalendarUnitDay;
} else if (repeats == 3) {
//每周循环
notif.repeatInterval = NSCalendarUnitWeekday;
} else if (repeats == 2) {
//每月循环
notif.repeatInterval = NSCalendarUnitMonth;
} else if (repeats == 1) {
//每年循环
notif.repeatInterval = NSCalendarUnitYear;
} else {
//不循环
}
[[UIApplication sharedApplication] scheduleLocalNotification:notif];
}
}
2、移除本地推送通知的方法
/** 移除某一个指定的通知*/
+ (void)removeNotificationWithIdentifierID:(NSString *)noticeId
{
if (@available(iOS 10.0, *)) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) {
for (UNNotificationRequest *req in requests){
NSLog(@"ECKPushSDK log: 当前存在的本地通知identifier: %@\n", req.identifier);
}
}];
[center removePendingNotificationRequestsWithIdentifiers:@[noticeId]];
} else {
NSArray *array = [[UIApplication sharedApplication] scheduledLocalNotifications];
for (UILocalNotification *localNotification in array){
NSDictionary *userInfo = localNotification.userInfo;
NSString *obj = [userInfo objectForKey:@"identifier"];
if ([obj isEqualToString:noticeId]) {
[[UIApplication sharedApplication] cancelLocalNotification:localNotification];
}
}
}
}
/** 移除所有通知*/
+ (void)removeAllNotification
{
if (@available(iOS 10.0, *)) {
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center removeAllPendingNotificationRequests];
}else {
[[UIApplication sharedApplication] cancelAllLocalNotifications];
}
}
3、接收到通知处理
iOS10.0之前的接收方法,在Appdelegate中重写下面方法
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
//接收到本地通知方法
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
//接收到远程通知方法
}
iOS10.0以后的接收推送方法
#import <UserNotifications/UserNotifications.h>
//首先需要设置代理UNUserNotificationCenterDelegate
if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0){
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
[center removeAllPendingNotificationRequests];
}
//再实现UNUserNotificationCenterDelegate代理的方法
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
{
//应用在前台时候接收到本地推送通知、远程推送通知调用此方法
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler
{
//应用程序在后台,用户通过点击本地推送、远程推送进入app时调用此方法
}