UserNotifications.framework框架的主要 类文件:
{
UNCalendarNotificationTrigger
UNLocationNotificationTrigger
UNTimeIntervalNotificationTrigger
UNMutableNotificationContent
UNNotification
UNNotification Action
UNNotification Attachment
UNNotification Category
UNNotification Content
UNNotification Request
UNNotification Response
UNNotification ServiceExtension
UNNotification Settings
UNNotification Sound
UNNotification Trigger
UNPushNotificationTrigger
UNTextInputNotification Action
UNTextInputNotification Response
UNUserNotificationCenter
};
开发步骤:在AppDelegate.m中注册通知:
1、在项目中添加:UserNotifications.framework框架
2、导入头文件:#import <UserNotifications/UserNotifications.h>
3、然后遵循代理:
@interface AppDelegate () <UNUserNotificationCenterDelegate>
4、在- didFinishLaunchingWithOptions做如下操作:
//第一步注册创建通知
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//使用UNUserNotificationCenter来管理通知
// 1、请求用户授权:
UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
//处理通知:设置UNUserNotificationCenterDelegate:
//注意:UNUserNotificationCenter的delegate必须在application:willFinishLaunchingWithOptions: or application:didFinishLaunchingWithOptions:方法中实现;
center.delegate = self;
//请求授权选项:
// UNAuthorizationOption Badge= 1 (1 << 0), ( bædʒ校徽)
// UNAuthorizationOption Sound= 2 (1 << 1),
// UNAuthorizationOption Alert= 4 (1 << 2),
// UNAuthorizationOption CarPlay = 8 (1 << 3),
//2、iOS 10使用以下方法注册,才能得到授权,注册通知以后,会自动注册deviceToken,如果获取不到deviceToken,Xcode8下要注意开启Capability->Push Notification。(request rɪˈkwɛst 要求 authorization ˌɔθərəˈzeɪʃ(ə)n 授权)
//请求获取通知权限(角标,声音,弹框)
[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge)completionHandler:^(BOOL granted, NSError * _Nullable error) {
// Enable or disable features based on authorization.
}];
//或者你也可以以用 “ | ” ( kəmˈpliʃ(ə)n 完成 ˈhandlə,处理者)
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
//获取用户是否同意开启通知
NSLog(@"request authorization successed!");
}
}];
// 3、补充:获取当前的通知设置,UNNotificationSettings是只读对象,不能直接修改,只能通过以下方法获取
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
// UNAuthorizationStatus NotDetermined :没有做出选择
// UNAuthorizationStatus Denied :用户未授权
// UNAuthorizationStatus Authorized:用户已授权
//进行判断做出相应的处理
if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined)
{
NSLog(@"未选择");
}else if (settings.authorizationStatus == UNAuthorizationStatusDenied){
NSLog(@"未授权");
}else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized){
NSLog(@"已授权");
}
}];
return YES;
}
5、实现代理方法:
pragma mark: - UNUserNotificationCenterDelegate
//在展示通知前进行处理,即有机会在展示通知前再修改通知内容。
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
//1.处理通知
//2.处理完成后条用completionHandler,用于指示在前台显示通知的形式
completionHandler(UNNotificationPresentationOptionAlert);
}
//第二步:新建通知内容对象
6、然后在ViewController.h里面声明并实现方法
+(void)registerNotification:(NSInteger )alerTime;
最后在ViewController.m里面实现方法即可也要
导入头文件:#import <UserNotifications/UserNotifications.h>
代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
//另外创建了一个方法单独处理:该方法有一个参数作为:alertTime
[ViewController registerNotification:3]; //写了一个类方法
}
//推送本地通知://使用UNNotification本地通知
+ (void)registerNotification:(NSInteger )alerTime{
// UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];//①
//需创建一个包含待通知内容的UNMutableNotificationContent对象,注意不是UNNotificationContent ,此对象为不可变对象。
UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
content.title = @"iOS10通知";
content.subtitle = @"新通知学习笔记";
content.body = @"新通知变化很大,之前本地通知和远程推送是两个类,现在合成一个了。这是一条测试通知,";
content.badge = @1;
UNNotificationSound *sound = [UNNotificationSound soundNamed:@"caodi.m4a"];
content.sound = sound;
//这是系统自带的通知声音
//UNNotificationSound *sound = [UNNotificationSound defaultSound];
//或者也可以这样创建:
//content.title = [NSString localizedUserNotificationStringForKey:@"Hello!" arguments:nil];
//content.body= [NSString localizedUserNotificationStringForKey:@"Hello_message_body" arguments:nil];
//第三步:通知触发机制,设置触发时间(重复提醒,时间间隔要大于60s)
//在alertTime时间后推送本地推送
UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger
triggerWithTimeInterval:alerTime repeats:NO];
//补充:
//UserNotifications提供了三种触发器:
//UNTimeIntervalNotificationTrigger:一定时间后触发
//UNCalendarNotificationTrigger:在某月某日某时触发
//UNLocationNotificationTrigger:在用户进入或是离开某个区域时触发
//第四步:创建UNNotificationRequest通知请求对象//创建一个发送请求
NSString *requestIdentifier = @"RequestIdentifier";
UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier: requestIdentifier content:content trigger:trigger];
//而@"RequestIdentifier"请求的标识符可以用来管理通知:
-移除还未展示的通知
[center removePendingNotificationRequestsWithIdentifiers: @[@"RequestIdentifier"]];
[center removeAllPendingNotificationRequests]; //- (void)cancelAllLocalNotifications;
-移除已经展示过的通知
[center removeDeliveredNotificationsWithIdentifiers:@[@"RequestIdentifier"]];
[center removeAllDeliveredNotifications];
-获取未展示的通知
[center getPendingNotificationRequestsWithCompletionHandler:^(NSArray * _Nonnull requests) {
NSLog(@"%@",requests);
}];
-获取展示过的通知
[center getDeliveredNotificationsWithCompletionHandler:^(NSArray * _Nonnull notifications) {
NSLog(@"%@",notifications);
}];
//第五步:将通知请求添加到通知中心(UNUserNotificationCenter):
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
NSLog(@"Error:%@",error);
}];
//或者也可以在添加推送成功后的处理!注意这里的center如果在①处创建,则可以这样
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error)
{
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"本地通知" message:@"成功添加推送" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];
[alert addAction:cancelAction];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];
}];
}