iOS開發本地推送(iOS10)UNUserNotificationCenter
阿新 • • 發佈:2020-12-02
https://www.cnblogs.com/xianfeng-zhang/p/8310394.html
1、簡介
iOS10之後蘋果對推送進行了封裝,UNUserNotificationCenter就這樣產生了。簡單介紹本地推送的使用UserNotifications官方文件說明!
2、簡單使用UNUserNotificationCenter
一、建立UNUserNotificationCenter,設定推送模式和代理!
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert|UNAuthorizationOptionSound|UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (!error) { NSLog(@"succeeded!"); } }]; center.delegate = self;
二、設定推送內容
UNMutableNotificationContent *content = [UNMutableNotificationContent new]; content.title = @"推送中心標題"; content.subtitle = @"副標題"; content.body = @"這是UNUserNotificationCenter資訊中心"; content.badge = @20; content.categoryIdentifier = @"categoryIdentifier"; // 需要解鎖顯示,紅色文字。點選不會進app。 // UNNotificationActionOptionAuthenticationRequired = (1 << 0), // // 黑色文字。點選不會進app。 // UNNotificationActionOptionDestructive = (1 << 1), // // 黑色文字。點選會進app。 // UNNotificationActionOptionForeground = (1 << 2), UNNotificationAction *action = [UNNotificationAction actionWithIdentifier:@"enterApp" title:@"進入應用" options:UNNotificationActionOptionForeground]; UNNotificationAction *clearAction = [UNNotificationAction actionWithIdentifier:@"destructive" title:@"忽略2" options:UNNotificationActionOptionDestructive]; UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:@"categoryIdentifier" actions:@[action,clearAction] intentIdentifiers:@[requestID] options:UNNotificationCategoryOptionNone]; [center setNotificationCategories:[NSSet setWithObject:category]];
三、設定推送方式
UNTimeIntervalNotificationTrigger *timeTrigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:60 repeats:YES]; UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestID content:content trigger:timeTrigger];
trigger的其它用法:
//1分鐘後提醒 UNTimeIntervalNotificationTrigger *trigger1 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:60 repeats:NO]; //每小時重複 1 次 UNTimeIntervalNotificationTrigger *trigger2 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:3600 repeats:YES]; //週日早8點 NSDateComponents *components = [[NSDateComponents alloc] init]; components.weekday = 1; components.hour = 8; UNCalendarNotificationTrigger *trigger3 = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES]; //#import <CoreLocation/CoreLocation.h> CLRegion *region = [[CLRegion alloc] init]; UNLocationNotificationTrigger *trigger4 = [UNLocationNotificationTrigger triggerWithRegion:region repeats:NO];
四、新增推送request
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { }];
3、UNUserNotificationCenter的Delegate
//將要推送 - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{ NSLog(@"----------willPresentNotification"); } //已經完成推送 - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler{ NSLog(@"============didReceiveNotificationResponse"); NSString *categoryID = response.notification.request.content.categoryIdentifier; if ([categoryID isEqualToString:@"categoryIdentifier"]) { if ([response.actionIdentifier isEqualToString:@"enterApp"]) { if (@available(iOS 10.0, *)) { } else { // Fallback on earlier versions } }else{ NSLog(@"No======"); } } completionHandler(); }
4、移除推送
[center removePendingNotificationRequestsWithIdentifiers:@[requestID]]; [center removeAllDeliveredNotifications];
附錄:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. if (@available(iOS 10.0, *)) { //第一步:獲取推送通知中心 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert|UNAuthorizationOptionSound|UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (!error) { NSLog(@"succeeded!"); } }]; center.delegate = self; //第二步:設定推送內容 UNMutableNotificationContent *content = [UNMutableNotificationContent new]; content.title = @"推送中心標題"; content.subtitle = @"副標題"; content.body = @"這是UNUserNotificationCenter資訊中心"; content.badge = @20; content.categoryIdentifier = @"categoryIdentifier"; // 需要解鎖顯示,紅色文字。點選不會進app。 // UNNotificationActionOptionAuthenticationRequired = (1 << 0), // // 黑色文字。點選不會進app。 // UNNotificationActionOptionDestructive = (1 << 1), // // 黑色文字。點選會進app。 // UNNotificationActionOptionForeground = (1 << 2), UNNotificationAction *action = [UNNotificationAction actionWithIdentifier:@"enterApp" title:@"進入應用" options:UNNotificationActionOptionForeground]; UNNotificationAction *clearAction = [UNNotificationAction actionWithIdentifier:@"destructive" title:@"忽略2" options:UNNotificationActionOptionDestructive]; UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:@"categoryIdentifier" actions:@[action,clearAction] intentIdentifiers:@[requestID] options:UNNotificationCategoryOptionNone]; [center setNotificationCategories:[NSSet setWithObject:category]]; //第三步:設定推送方式 UNTimeIntervalNotificationTrigger *timeTrigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:60 repeats:YES]; UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestID content:content trigger:timeTrigger]; //第四步:新增推送request [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { }]; [center removePendingNotificationRequestsWithIdentifiers:@[requestID]]; [center removeAllDeliveredNotifications]; // [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { // NSLog(@"settings===%@",settings); // }]; } else { } return YES; } #pragma mark - UNUserNotificationCenterDelegate //將要推送 - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{ NSLog(@"----------willPresentNotification"); } //已經完成推送 - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler{ NSLog(@"============didReceiveNotificationResponse"); NSString *categoryID = response.notification.request.content.categoryIdentifier; if ([categoryID isEqualToString:@"categoryIdentifier"]) { if ([response.actionIdentifier isEqualToString:@"enterApp"]) { if (@available(iOS 10.0, *)) { } else { // Fallback on earlier versions } }else{ NSLog(@"No======"); } } completionHandler(); }