zoukankan      html  css  js  c++  java
  • iOS10--消息通知的基本使用

    官方将通知单独放在了UserNotifications.framework,使用时需要导入框架。
    UserNotifications.framework主要类文件:

    UNCalendarNotificationTrigger
    UNLocationNotificationTrigger
    UNMutableNotificationContent
    UNNotification
    UNNotificationAction
    UNNotificationAttachment
    UNNotificationCategory
    UNNotificationContent
    UNNotificationRequest
    UNNotificationResponse
    UNNotificationServiceExtension
    UNNotificationSettings
    UNNotificationSound
    UNNotificationTrigger
    UNPushNotificationTrigger
    UNTextInputNotificationAction
    UNTextInputNotificationResponse
    UNTimeIntervalNotificationTrigger
    UNUserNotificationCenter

    UNUserNotificationCenter的应用:

    • 请求用户授权:
      UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];    
      // 请求授权    
      /*     
      UNAuthorizationOptionBadge   = (1 << 0),     
      UNAuthorizationOptionSound   = (1 << 1),     
      UNAuthorizationOptionAlert   = (1 << 2),     
      UNAuthorizationOptionCarPlay = (1 << 3),     
      */    
      [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {  if(granted){

         if(granded)
           //同意
         }else{
           //不同意
         }

      }];

      补充:获取授权设置信息
      // 获取通知授权和设置    
      [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {        
      /*         
      UNAuthorizationStatusNotDetermined : 没有做出选择         
      UNAuthorizationStatusDenied : 用户未授权         
      UNAuthorizationStatusAuthorized :用户已授权         
      */        
      if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) 
      {                       
            NSLog(@"未选择");                  
      }else if (settings.authorizationStatus == UNAuthorizationStatusDenied){                        
            NSLog(@"未授权");                   
      }else if (settings.authorizationStatus == UNAuthorizationStatusAuthorized){                      
            NSLog(@"已授权");        
      }       
      }]
    • 创建本地通知:

      // 创建一个本地通知
      UNMutableNotificationContent *content_1 = [[UNMutableNotificationContent alloc] init];    
      // 主标题    
      content_1.title = [NSString localizedUserNotificationStringForKey:@"title" arguments:nil];    
      // 副标题    
      content_1.subtitle = [NSString localizedUserNotificationStringForKey:@"subtitle" arguments:nil];    
      content_1.badge = [NSNumber numberWithInteger:1];    
      content_1.body = [NSString localizedUserNotificationStringForKey:@"title_message_for_yan" arguments:nil];    
      content_1.sound = [UNNotificationSound defaultSound];    
      // 设置触发时间    
      UNTimeIntervalNotificationTrigger *trigger_1 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:10 repeats:NO];    
      // 创建一个发送请求
      UNNotificationRequest *request_1 = [UNNotificationRequest requestWithIdentifier:@"my_notification" content:content_1 trigger:trigger_1];

      补充:

      • UserNotifications提供了三种触发器:
        UNTimeIntervalNotificationTrigger :一定时间后触发
         
        UNCalendarNotificationTrigger : 在某月某日某时触发
         
        UNLocationNotificationTrigger : 在用户进入或是离开某个区域时触发
      • @“my_notification”请求的标识符可以用来管理通知:
        - 移除还未展示的通知
        [center removePendingNotificationRequestsWithIdentifiers: @[@“my_notification”]];
        [center removeAllPendingNotificationRequests]; // - (void)cancelAllLocalNotifications;
         
        - 移除已经展示过的通知
        [center removeDeliveredNotificationsWithIdentifiers:@[@“my_notification”]];
        [center removeAllDeliveredNotifications];
         
        - 获取未展示的通知
        [center getPendingNotificationRequestsWithCompletionHandler:^(NSArray<UNNotificationRequest *> * _Nonnull requests) {
            NSLog(@"%@",requests);
        }];
         
        - 获取展示过的通知
        [center getDeliveredNotificationsWithCompletionHandler:^(NSArray<UNNotification *> * _Nonnull notifications) {
            NSLog(@"%@",notifications);
        }];
      • 远程通知的格式:
        { "aps":{ "alert":{ "title":"I am title", "subtitle":"I am subtitle", "body":"I am body" }, "sound":"default", "badge":1 } }
        具体请参考官方文档
    • 将通知请求添加到通知中心(UNUserNotificationCenter):

      [center addNotificationRequest:request_1 withCompletionHandler:^(NSError * _Nullable error) {

      }];
             
     
     
    接收通知
    • 处理通知:
      设置UNUserNotificationCenterDelegate
      注意:UNUserNotificationCenter 的 delegate 必须在 application:willFinishLaunchingWithOptions: orapplication:didFinishLaunchingWithOptions: 方法中实现;

      center.delegate = self;
      • 应用内展示通知:

        - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
            // 如果不想显示某个通知,可以直接用空 options 调用 completionHandler: // completionHandler([])
            completionHandler(UNNotificationPresentationOptionBadge + UNNotificationPresentationOptionSound);
        }
      • 在用户与你推送的通知进行交互时被调用:
        - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
            completionHandler();
            NSLog(@"userInfo--%@",response.notification.request.content.userInfo);
        }

    UNNotificationCategory的应用:

    • 创建一个 category:
       
      /*
       
      UNNotificationActionOptionAuthenticationRequired = (1 << 0),
       
      UNNotificationActionOptionDestructive = (1 << 1), 取消
       
      UNNotificationActionOptionForeground = (1 << 2), 启动程序
       
      */
       
      UNTextInputNotificationAction *textAction = [UNTextInputNotificationAction actionWithIdentifier:@"my_text" title:@"text_action" options:UNNotificationActionOptionForeground textInputButtonTitle:@"输入" textInputPlaceholder:@"默认文字"];
       
      UNNotificationAction *action = [UNNotificationAction actionWithIdentifier:@"my_action" title:@"action" options:UNNotificationActionOptionDestructive];
       
      UNNotificationAction *action_1 = [UNNotificationAction actionWithIdentifier:@"my_action_1" title:@"action_1" options:UNNotificationActionOptionAuthenticationRequired];
       
      /*
       
      UNNotificationCategoryOptionNone = (0),
       
      UNNotificationCategoryOptionCustomDismissAction = (1 << 0),
       
      UNNotificationCategoryOptionAllowInCarPlay = (2 << 0),
       
      */
       
      UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:@"my_category" actions:@[textAction,action,action_1] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
       
      NSSet *setting = [NSSet setWithObjects:category, nil];
       
      [center setNotificationCategories:setting];
    • 在创建 UNNotificationContent 时把 categoryIdentifier 设置为需要的 category id 即可:
      content.categoryIdentifier = @"my_category";

      远程推送也可以使用 category,只需要在 payload 中添加 category 字段,并指定预先定义的 category id 就可以了

    • 处理category的通知:
      - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
       
      completionHandler();
       
      NSLog(@"userInfo--%@",response.notification.request.content.userInfo);
       
      // 获取通知中心的所有的Categories
       
      [center getNotificationCategoriesWithCompletionHandler:^(NSSet<UNNotificationCategory *> * _Nonnull categories) {
       
      for (UNNotificationCategory *category in categories) {
       
      if ([category.identifier isEqualToString:@"my_category"] && [response.notification.request.content.categoryIdentifier isEqualToString:@"my_category"]) {
       
      for (UNNotificationAction *textAction in category.actions) {
       
      if ([textAction.identifier isEqualToString:@"my_text"]) {
       
      UNTextInputNotificationAction *text = (UNTextInputNotificationAction *)textAction;
       
      UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:text.textInputButtonTitle preferredStyle:UIAlertControllerStyleAlert];
       
      [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:nil]];
       
      [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];
       
      }
       
      }
       
      }
       
      }
       
      }];
       
      }
              
    长按 3D touch 效果图

              
    进入应用
    iOS 10 中被标为弃用的 API
    UILocalNotification
    UIMutableUserNotificationAction
    UIMutableUserNotificationCategory
    UIUserNotificationAction
    UIUserNotificationCategory
    UIUserNotificationSettings
    handleActionWithIdentifier:forLocalNotification:
    handleActionWithIdentifier:forRemoteNotification:
    didReceiveLocalNotification:withCompletion:
    didReceiveRemoteNotification:withCompletion:

    来源

  • 相关阅读:
    docker 部署aps.net MVC到windows容器
    docker 搭建私有仓库 harbor
    解决关于:Oracle数据库 插入数据中文乱码 显示问号???
    ionic cordova build android error: commamd failed with exit code eacces
    cordova build android Command failed with exit code EACCES
    Xcode 10 iOS12 "A valid provisioning profile for this executable was not found
    使用remix发布部署 发币 智能合约
    区块链: 编译发布智能合约
    mac 下常用命令备忘录
    JQuery fullCalendar 时间差 排序获取距当前最近的时间。
  • 原文地址:https://www.cnblogs.com/jiuyi/p/10314551.html
Copyright © 2011-2022 走看看