ios-ios10设置本地通知

iOS10新增了UserNotificationKit框架,下面就简单的总结下,我遇到的用法以及一些知识点

首先我们要去请求用户的权限,请求授权,一般来说我们是在didFinishLaunchingWithOptions 这个方法中调用的,下面设置了这个通知中心的代理,那么appDelegate中要遵守<UNUserNotificationCenterDelegate>这个协议

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    //使用 UNUserNotificationCenter 来管理通知
    UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter];
    //监听回调事件
    center.delegate = self;
    
    //ios10及之后用下面的方法注册
    //    UNAuthorizationOptionBadge   = (1 << 0), 图标标记
    //    UNAuthorizationOptionSound   = (1 << 1), 声音
    //    UNAuthorizationOptionAlert   = (1 << 2), 提醒
    //    UNAuthorizationOptionCarPlay = (1 << 3), 这个一般没什么用,专为车载系统定制
    [center requestAuthorizationWithOptions:UNAuthorizationOptionBadge |UNAuthorizationOptionSound | UNAuthorizationOptionAlert 
    completionHandler:^(BOOL granted, NSError * _Nullable error) {
        //此处granted表示的是有没有全部授权成功,如果为YES就表示全部授权成功,NO的话就表示没有。
        //这里之所以这么说是因为文档中显示如下图所示
 }];
    
    
    //获取用户授权相关设置信息的接口,UNNotificationSettings 是只读对象,是不能直接修改,只能通过以下方法获取
    [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
        NSLog(@"%@",settings);
        /*
         UNAuthorizationStatusNotDetermined : 没有做出选择
         UNAuthorizationStatusDenied : 用户未授权
         UNAuthorizationStatusAuthorized :用户已授权
         */
        if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined)
        {
            NSLog(@"未选择");
        }else if (settings.authorizationStatus == UNAuthorizationStatusDenied){
            NSLog(@"未授权");
        }else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized){
            NSLog(@"已授权");
        }
    }];
    return YES;
}
这里解释了granted值的情况

UNUserNotificationCenterDelegate 这个协议中总共有两个方法,而且都是可选的,如下所示,

//当应用处于前台时,收到的通知是无法进行展示的。如果我们希望在应用内也能显示通知的话,需要额外的工作,重写下面的方法回调了下面才可以在前台显示
//completionHandler后的任何代码都不执行,所以要把completionHandler放在你写的代码之后
 -(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withComple
tionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
{
    NSLog(@"-------");
    //可设置是否在应用内弹出通知
    completionHandler(UNNotificationPresentationOptionAlert|UNNotificationPresentationOptionSound);
}
还有个方法是点击了推送消息之后的回调,我们完全可以在这里面进行设置点击了推送消息中,跳到app中的某个界面。

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)
response withCompletionHandler:(void (^)(void))completionHandler
{
    
    /**
     对应action的处理
     点击了推送消息之后,我们可以通过获取request中的categoryIdentifier和response中的actionIdentifier就能知道是哪个通知中的哪个action被执行。
     如果action是带有文本信息的UNTextInputNotificationAction,可以把response转为UNTextInputNotificationResponse类型,就可以拿到用户输入的内容
     */
  
    NSLog(@"userInfo--%@",response.notification.request.content.userInfo);
    
    UITabBarController * vc = (UITabBarController *)self.window.rootViewController;
    
    vc.selectedIndex = [response.notification.request.content.userInfo[@"selectIndex"]intValue];
    
     获取通知中心的所有的Categories,也就是通知的策略,可以根据下面方法来获取
    //  [center getNotificationCategoriesWithCompletionHandler:^(NSSet<UNNotificationCategory *> * _Nonnull categories) {    }];
     //此处结束之后要去调用,其实就是苹果需要知道你这个程序前面的代码什么时候执行完,可以方便的去做一个资源的调配工作
     completionHandler();
     

} 
因为介绍中有这么一段话,这段话的意思就是,使用此方法执行与应用程序的自定义操作相关联的任务。当用户响应通知时,系统将调用该方法和结果。您使用此方法执行与

该操作相关联的任务,如果有的话。在你实施结束时,你必须调用completionhandler块让系统知道你是做过处理的通知。


包括下面对这个参数的描述也是这个意思,大致的意思就是完成用户响应后执行的块。必须从方法中执行此块,并应尽快调用它。块没有返回值或参数。


发送通知的方法

//使用UNUserNotification来管理通知
    UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter];
    
    //需创建一个包含待通知内容的 UNMutableNotificationContent 对象,注意不是 UNNotificationContent ,此对象为不可变对象,一般用于远程通知。
    //通知内容分为可变的以及不可变的两种类型,类似于可变数组跟不可变数组。后续我们通过某一特定标识符更新通知,便是用可变通知了
    UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
    //    attachments         //附件
    //    badge               //数字标志
    //    title               //推送内容标题
    //    subtitle            //推送内容子标题
    //    body                //推送内容body
    //    categoryIdentifier  //category标识,操作策略
    //    launchImageName     //点击通知进入应用的启动图
    //    sound               //声音
    //    userInfo              //附带通知内容
    
    content.title = @"sss";
    content.body = @"哈哈";
    content.badge = @5;
    content.sound = [UNNotificationSound defaultSound];
    content.userInfo = @{@"selectIndex":@(1)};
    
    //设置通知的触发时间
    //上面的方法是指5秒钟之后执行。repeats这个属性,如果需要为重复执行的,则TimeInterval必须大于60s,否则会报time interval must be at least 
    //60 if repeating,这里如果重复的去调用的话,通知还是只有一个
     //下面设置延迟5s,发送通知
     UNTimeIntervalNotificationTrigger * trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];
      //包装成通知请求
    UNNotificationRequest * request = [UNNotificationRequest requestWithIdentifier:@"tongzhi" content:content trigger:trigger];
    
    //通知中心添加这个通知请求
    [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        
    }];
通知触发模式有下面四种

UNPushNotificationTrigger 系统自动设置(是区分本地通知和远程通知的标识)

UNTimeIntervalNotificationTrigger 我们设置的指定什么时间后触发

UNCalendarNotificationTrigger 指定一个日期然后去触发

UNLocationNotificationTrigger 根据位置来触发,进入某地或者离开某地或者都可以触发

还有需要注意的是这里用的是UNMutableNotificationContent而不是UNNotificationContent是因为UNNotificationContent中的属性都是只读的,创建了也根本无法进行修改,还有一点就是根据文档显示

还有就是我们可以给通知设置成可以和用户交互了,这里引入一个Category类目的概念还有个是Action可以理解成按钮一样的东西,可以在这里进行设置

 //UNTextInputNotificationAction,这个就是带有文本输入的按钮
    
    //textInputPlaceholder文本框的默认文字,输入就是文本框右边的按钮的名字
    UNTextInputNotificationAction *textAction = [UNTextInputNotificationAction actionWithIdentifier:@"text" title:
    @"文本输入按钮" options:UNNotificationActionOptionForeground textInputButtonTitle:@"输入" textInputPlaceholder:@"输入内容"];
    
    //UNNotificationActionOptionDestructive,代表的就是销毁此条推送
    UNNotificationAction *action = [UNNotificationAction actionWithIdentifier:@"destructive" title:@"销毁" options:
     NNotificationActionOptionDestructive];
    //UNNotificationActionOptionAuthenticationRequired在锁屏状态需要解锁显示,点击不会进app,
    // UNNotificationActionOptionForeground = (1 << 2),当在锁屏状态下点击之后会要求先解锁,然后再进去,设置起来是黑色的文字。点击会进app。
    UNNotificationAction *action1 = [UNNotificationAction actionWithIdentifier:@"action_1" title:@"哈哈" options:
     UNNotificationActionOptionAuthenticationRequired];
    
    //一个通知可以注册多个category. 发送通知时,UNMutableNotificationContent选择一个category进行绑定
    UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:@"my_category" actions:
     @[textAction,action,action1] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
    
    // 将 category 添加到通知中心
    NSSet *setting = [NSSet setWithObjects:category, nil];
    [center setNotificationCategories:setting];
    content.categoryIdentifier = @"my_category";

然后我们可以在下面这个方法中做一些操作

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler
{
 if([response.actionIdentifier isEqualToString:@"text"])
    {
        
        UNTextInputNotificationResponse *textResponse = (UNTextInputNotificationResponse *)response;
        
        NSLog(@"%@",textResponse.userText);
        
    }

}












  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值