iOS 10 通知 + 推送 初级篇(三)

# 希望对学习iOS的朋友会有所帮助
//  ViewController.m
//  iOS10推送通知
//  Created by mac on 2016/10/27.
//  Copyright © 2016年 Rock. All rights reserved.
#import "ViewController.h"
#import 
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    /*
     iOS 10 关于通知推送的新特性,相比之前主要有以下几点的较大改变:
     1.通知推送内容更加丰富,由之前的alert 到现在的title, subtitle, body
     2.通知推送代码可以从AppDelegate中剥离。
     3.通知推送的注册、设置、处理更加结构化、更易于模块化开发。
     4.UserNotification支持自定义通知音效和启动图、支持向通知内容中添加媒体附件:例如音频,视频 、支持开发者定义多套通知模板 、支持完全自定义的通知界面 、支持自定义通知中的用户交互按钮。这就使推送内容更加丰富多彩
     5.通知的触发更加容易管理,推送统一由trigger触发, 并且方便的更新推送内容
  
     iOS 10 中将通知相关的API整合成了 UserNotification.framework, 其结构十分类似于iOS 8 中的 UIWebView 向 WebKit框架整合的思路。现在的用户通知做成了类似于网络请求,先发一个 request 得到 response 的流程,还封装了error,可以在各个状态的方法中做一些额外的操作,并且能获得一些字段,比如发送者之类的.
     
     UserNotification.framework 中主头文件是:
     #import 
     里面有以下文件:
     #import 
     #import 
     #import 
     #import 
     #import 
     #import 
     #import 
     #import 
     #import 
     #import 
     #import 
     #import 
     #import 
     #import 
     
     下面具体讲解一下每个类具体作用:
     1.UNNotification   主要是作为通知delegate方法的参数使用。包含 UNNotificationRequest 信息。
     2.UNNotificationAction    是通知中添加的action,展示在通知栏的下方。默认以的button样式展示。有一个文本输入的子类 UNTextInputNotificationAction。可以在点击button之后弹出一个键盘,输入信息。用户点击信息和输入的信息可以在UNNotificationResponse 中获取。
     3.UNNotificationAttachment    是新增的通知内容格式,可以设置图像和视频。
     4.UNNotificationCategory    是通知样式类型。在注册通知之后,展示通知之前,可以自定义通知样式,并使用
     eg:
     [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSetsetWithObject:categoryNotification]]; 设置到通知中心中。根据通知内容中的categoryIdentifier使用不同的通知样式。这里需要注意:使用自定义的通知操作按钮和通知Content可以设置为同一个category。
     5.UNNotificationContent    通知的主体内容,原通知的title,sound,badge和 新的attachments,lacnchImageName都在这里进行设置,是创建一个通知的前提。
     6.UNNotificationRequest    通知请求。当通知内容,触发条件都准备好之后,需要包装为一个通知请求,由通知中心来激活这个通知。
     7.UNNotificationResponse    通知响应。作为通知的action被用户触发之后,App可以拿到的信息,和action对应,有普通的UNNotificationResponse 和 子类UNTextInputNotificationResponse。其中包括action的identifier和完整的UNNotification。子类UNTextInputNotificationResponse还包含userText,用户输入的内容。
     8.UNNotificationServiceExtension    一个extension,用户可以在收到特性的通知时,一般是远程,并且该远程通知的apns中包含一个mutable-content字段,值为1。
     9.UNNotificationSetting (下面有介绍)
     10.UNNotificationSound    通知的声音。可以直接使用声音的name,而不是文件路径。
     11.UNNotificationTrigger    通知的触发条件 (下面有讲解:)
     12.UNUserNotificationCenter    通知中心。最主要的类,通知的注册,激活,编辑,删除等功能都由该类完成。
     */ 
    // 注册推送: 在设置通知的时候,需要先进行注册,获取授权 iOS 10 所有通知都是通过UNUserNotificationCenter来管理,包括远程通知和本地通知,都将采用注册,以及请求发送的形式 在AppDelegate.m 中注册(不懂得可以看上一篇文章)
    [ViewController registerNotification:6]; 
}
+(void)registerNotification:(NSInteger )alerTime {
    //第二步:初始化通知组件
    // 创建UNMutableNotificationContent  (content kənˈtɛnt 内容),然后可以指明各种属性。 当然还可以在其中添加附件(UNNotificationAttachment),附件可以是音乐、视频、图片;
    
    /*
     UNNoticificationContent (一个设置通知组件的类,title,message,categoryIdentifier,媒体图片,视频,等都装在这个结构体中发出通知请求,它还有一个和它一对的类UNMutableNoticificationContent)
     我们是不能直接创建UNNotificationContent的实例的, 如果我们需要自己去配置内容的各个属性,我们需要用到UNMutableNotificationContent
     看一下它的一些属性:
     attachments          //附件
     badge                //徽标
     body                 //推送内容body
     categoryIdentifier   //category标识
     launchImageName      //点击通知进入应用的启动图
     sound                //声音
     subtitle             //推送内容子标题
     title                //推送内容标题
     userInfo             //远程通知内容
     */
    
    UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
    content.badge = @6;
    // 此处设置了badge,在Appdelegate中可以清除。
    // [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
    
    //带两个Title的本地通知 该通知携带两个相对新的字段,title和subtitle,都是字符类型。作为标题显示。
    content.title = @"大标题";
    // content.subtitle = @"这里没写content.subtitle"; //将不会显示
    content.body  = @"我是一只小小鸟"; //如果没有subtitle,则弹出通知只有body
    UNNotificationSound *sound = [UNNotificationSound defaultSound];
    // 也可以设置自己APP通知的声音
    //UNNotificationSound *sound = [UNNotificationSound soundNamed:@"sound"];
    content.sound = sound;//通知声音
    
    NSError *error = nil;
    NSString *path = [[NSBundle mainBundle] pathForResource:@"tupian" ofType:@"png"];
    UNNotificationAttachment *att = [UNNotificationAttachment attachmentWithIdentifier:@"att1" URL:[NSURL fileURLWithPath:path] options:nil error:&error];
    if (error) {
        NSLog(@"attachment error %@", error);
    }
    content.attachments = @[att];
    
    //content.launchImageName = @"1-Eb_0OvtcxJXHZ7-IOoBsaQ";

    //iOS 10 的推送分为标题、副标题和主体。所以在代码中,我们都要去设置相对应的属性,body 可以为空,这样就不会显示出来。上面代码创建的通知,只会显示一次,如果想让通知一直显示的话,可以将repeats这个参数设置为YES,就是重复推送。
    UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:alerTime repeats:NO];//6秒后推送
    /*
     创建通知触发器(UNNotificationTrigger)
     设置通知的触发时机:触发器分为四种:
     UNPushNotificationTrigger   触发APNS服务,系统自动设置(这是区分本地通知和远程通知的标识)
     UNTimeIntervalNotificationTrigger 一段时间后触发,设置多久后触发通知;概括来说,就是在一个指定的时间内,发起推送。可指定一个时间后发起推送,可指定相隔一段时间发起推送。时间由timeInterval决定,是否重复推送由repeats决定。
     UNCalendarNotificationTrigger 指定日期触发,设置某时固定触发通知;在指定的一个日期时间发起通知,比如在星期一的8:30发起一个通知,提醒我要去上班。当然,也可以设置为重复推送,即每周一的8:30发起一个通知。具体发起通知的时间由NSDateComponents类决定,具体的过程如下代码:是否重复推送还是由repeats决定。用UNCalendarNotificationTrigger就可以做出类似于苹果"提醒事项"的东西了
     UNLocationNotificationTrigger 根据位置触发,设置当进入某一区域触发通知 或离开某一区域也触发 所以这个类,就是当我们进入一个我们规定的区域时,就给我们发起通知。所规定的区域由CLRegion这个类来决定,用 UNLocationNotificationTrigger也可以做出点好玩的东西,比如,你觉得哪家店的东西很好吃,你就可以将其位置设置为一个范围,当你每次进入该店的一个范围时,手机都会给你推送,“这家店的东西不错。”
     
     //代码如下:
     //十秒后  UNTimeIntervalNotificationTrigger:
     UNTimeIntervalNotificationTrigger *trigger0 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:10 repeats:NO];
     //2分钟后提醒
     UNTimeIntervalNotificationTrigger *trigger1 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:120 repeats:NO];
     //每小时重复1次
     UNTimeIntervalNotificationTrigger *trigger2 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:3600 repeats:YES];
     
     
     //每周日早上8:00
     NSDateComponents *component = [[NSDateComponents alloc] init];
     component.weekday = 1;
     component.hour = 8;
     UNCalendarNotificationTrigger *trigger1 = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:component repeats:YES];
     
     //每周一早上8:00触发
     NSDateComponents *components = [[NSDateComponents alloc] init];
     components.weekday = 2;
     components.hour = 8;
     UNCalendarNotificationTrigger *trigger2 = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components repeats:YES];
     
     //圆形区域,进入时候进行通知
     CLLocationCoordinate2D cen = CLLocationCoordinate2DMake(80.335400, -90.009201);
     CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:cen
     radius:500.0 identifier:@“center"];
     region.notifyOnEntry = YES; //进入的时候
     region.notifyOnExit = NO;  //出去的时候
     UNLocationNotificationTrigger *trigger1 = [UNLocationNotificationTrigger
     triggerWithRegion:region repeats:NO];
  
    //传进去的参数有3个,第一个是一个中心,当然这是一个坐标点,需要经纬度,第二个是半径,也就是这个区域的半径,第三个是ID,自定义一个就行。创建好这个区域后,就可以传给CLRegion的创建方法了。是否重复推送还是由repeats决定。意思就是,每次当我进入这个范围的时候,就给我发起一条推送。
     */
    
   #  带图像的本地通知 图像必须是bundle包中的,可以下拉通知栏放大图像。
    NSString *imageLocalPath  = [[NSBundle mainBundle] pathForResource:@"photo.png" ofType:nil];
    if (imageLocalPath && ![imageLocalPath isEqualToString:@""]) {
        UNNotificationAttachment * imageAttachment = [UNNotificationAttachment attachmentWithIdentifier:@"photo" URL: [NSURL fileURLWithPath:imageLocalPath] options:nil error:nil];
       
        /*
         UNNotificationAction (添加交互事件,包括输入文字,点击按钮)
         UNNotificationAttachment (attachment əˈtætʃmənt 附加附件 )
         (媒体相关,想要推送带“图片”和”视频“的通知,但是只支持本地的图片和视频,想要获取数据只能下载到本地再推送哦。
         PS:这里有一个坑,通知后不用自己清除下载到本地的缓存,即使是存储在Document,发送完通知之后苹果会找到这条路径自动清空缓存,做项目的时候会发现存在那个路径的图片都在发送通知后的一瞬间被清空了,也就是说,想再利用这张图,要再下载,或者把这张图本地持久化,或者把图转成data存在NSUserDefaults了)
        */
        
        if (imageAttachment) {
            content.attachments = @[imageAttachment];
        }
    }
 
    # 带视频的本地通知
    // 需要注意的是导入视频的时候,默认不是添加到Bundle中,必须手动勾选 Add to target
    // 这样你会发现 之前添加的图片,换成了视频
    NSString *videoFilePath  = [[NSBundle mainBundle] pathForResource:@"video" ofType:@"mp4"];
    if (videoFilePath && ![videoFilePath isEqualToString:@""]) {
        UNNotificationAttachment * videoAttachment = [UNNotificationAttachment attachmentWithIdentifier:@"video" URL: [NSURL fileURLWithPath:videoFilePath] options:nil error:nil];
               if (videoAttachment) {
                   //如果是以这种方式创建的 array 默认只会取出lastObject;
                   content.attachments = @[videoAttachment];
        }
    }
    
    # //设置通知的下面的按钮事件   点击action 我们要在AppDelegate.m 中写相应的事件处理
    NSMutableArray * ationArray = [[NSMutableArray alloc]initWithCapacity:1];
    UNNotificationAction *actionA = [UNNotificationAction actionWithIdentifier:@"joinAppA" title:@"进入应用C" options:UNNotificationActionOptionForeground];
 
    //其中 UNTextInputNotificationAction 是 UNNotificationAction的子类,初始化方法中分别新增了,键盘右上角的点击按钮文本和文本输入框的默认文字。
    UNTextInputNotificationAction *actionB = [UNTextInputNotificationAction actionWithIdentifier:@"joinAppB" title:@"文本输入B" options:UNNotificationActionOptionDestructive textInputButtonTitle:@"回复" textInputPlaceholder:@"Say something"];
    
    //如果没有创建 NSMutableArray * ationArray
    // UNNotificationCategory *categoryNotification = [UNNotificationCategory categoryWithIdentifier:@"category1" actions:@[action2,action1] minimalActions:@[action2,action1] intentIdentifiers:@[@"action1",@"action2"] options:UNNotificationCategoryOptionCustomDismissAction];
    
    [ationArray addObjectsFromArray:@[actionA,actionB]];
    if ([ationArray count] >1) {
        
        UNNotificationCategory *categoryNotification = [UNNotificationCategory categoryWithIdentifier:@"category1" actions:ationArray intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
    
        [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObject:categoryNotification]];
        content.categoryIdentifier = @"category1";
        //这里设置@"category1", 是与之前设置的categoryWithIdentifier对应
    }
  
    #// 下面是不同的创建
    /*
     //一、
     NSMutableArray * ationArray = [[NSMutableArray alloc]initWithCapacity:1];
     UNNotificationAction *actionA = [UNNotificationAction actionWithIdentifier:@"actionA" title:@"进入应用保留badge" options:UNNotificationActionOptionForeground];
     UNNotificationAction *actionB = [UNNotificationAction actionWithIdentifier:@"actionA" title:@"进入应用清除badge" options:UNNotificationActionOptionForeground];
     [ationArray addObjectsFromArray:@[actionA,actionB]];
     
     if ([ationArray count] >1) {
     UNNotificationCategory *categoryNotification = [UNNotificationCategory categoryWithIdentifier:@"categoryNotification" actions:ationArray intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
     
     [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObject:categoryNotification]];
     content.categoryIdentifier = @"categoryNotification";
     
     }
     */
    
    /*
     // 二、
     NSMutableArray * ationArray = [[NSMutableArray alloc]initWithCapacity:1];
     UNNotificationAction *actionA = [UNNotificationAction actionWithIdentifier:@"needUnlock" title:@"需要解锁" options:UNNotificationActionOptionAuthenticationRequired];
     UNNotificationAction *actionB = [UNNotificationAction actionWithIdentifier:@"showRed" title:@"红色显示" options:UNNotificationActionOptionDestructive];
     [ationArray addObjectsFromArray:@[actionA,actionB]];
     
     if ([ationArray count] >1) {
     UNNotificationCategory *categoryNotification = [UNNotificationCategory categoryWithIdentifier:@"categoryOperationNotification" actions:ationArray intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
     
     [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObject:categoryNotification]];
     content.categoryIdentifier = @"categoryOperationNotification";
     }
     
     */
    
    /*
   
     //设置action 该方法中:
     + (instancetype)actionWithIdentifier:(NSString *)identifier 
     title:(NSString *)title 
     options:(UNNotificationActionOptions)options 
     textInputButtonTitle:(NSString *)textInputButtonTitle 
     textInputPlaceholder:(NSString *)textInputPlaceholder;
   
     # 补充说明:
     //两者 action 的区别在 UNNotificationActionOptions中。该枚举分3种,分别为
     // 需要解锁显示,红色文字。点击不会进app。
     // UNNotificationActionOptionAuthenticationRequired = (1 << 0),
     // 黑色文字。点击不会进app。
     // UNNotificationActionOptionDestructive = (1 << 1),
     // 黑色文字。点击会进app。
     // UNNotificationActionOptionForeground = (1 << 2),
     
     //设置category 
     + (instancetype)categoryWithIdentifier:(NSString *)identifier 
     actions:(NSArray *)actions 
     intentIdentifiers:(NSArray *)intentIdentifiers 
     options:(UNNotificationCategoryOptions)options;

     //UNNotificationActionOptionAuthenticationRequired 需要解锁
     //UNNotificationActionOptionDestructive 显示为红色
     //UNNotificationActionOptionForeground  点击打开app
     
     //UNNotificationCategoryOptionNone
     //UNNotificationCategoryOptionCustomDismissAction 清除通知被触发会走通知的代理方法
     //UNNotificationCategoryOptionAllowInCarPlay      适用于行车模式
     
     */
    
    # // 创建UNNotificationRequest
    //这个就是一个通知请求了。 以后添加通知、更新通知、删除通知就全靠他了
    // 1.创建一个UNNotificationRequest类的实例,一定要为它设置identifier, 在后面的查找,更新, 删除通知,这个标识是可以用来区分这个通知与其他通知
    // 2.把request加到UNUserNotificationCenter, 并设置触发器,等待触发
    // 3.如果另一个request具有和之前request相同的标识,不同的内容, 可以达到更新通知的目的
    
    NSString *requestIdentifer = @"requestIdentifier";
    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifer content:content trigger:trigger];
    
    //4. 将UNNotificationRequest添加到通知中。 一个通知就完成了。
    //注意:发送之前进行权限判断,用户随时都可能会关闭了通知
    //把通知加到UNUserNotificationCenter, 到指定触发点会被触发
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
        if (error) {
            NSLog(@"%@", error);
        }
        
    }];
       
    //在另外需要更新通知的地方
    UNMutableNotificationContent *newContent = [[UNMutableNotificationContent alloc] init];
    newContent.title = @"新的通知";
    newContent.subtitle = @"我是新的通知";
    newContent.body = @"半夜了,真的好困呀!!!";
    
    UNNotificationRequest *request1 = [UNNotificationRequest requestWithIdentifier:@"newIdentifier" content:newContent trigger:trigger];
    [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request1 withCompletionHandler:^(NSError * _Nullable error) {       
    }];

}  
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

哪里说得不对的话,记得留言 大家一起进步:


//  AppDelegate.m
//  iOS10推送通知2
//  Created by mac on 2016/10/27.
//  Copyright © 2016年 Rock. All rights reserved.

#import "AppDelegate.h"
#import 

#define IOS8 ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0 && [[UIDevice currentDevice].systemVersion doubleValue] < 9.0)
#define IOS8_10 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0 && [[UIDevice currentDevice].systemVersion doubleValue] < 10.0)
#define IOS10 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0)

@interface AppDelegate ()
@end
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    if (IOS10) {
        //之前的就不说了 以下是iOS 10 通知创建的方式
        // 所有的通知都是由 [UNUserNotificationCenter currentNotificationCenter]激活
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        
        // 权限申请 可以在项目启动的时候,或者控制器加载的时候进行权限申请,
        //Options中包含了各种权限。UNAuthorizationOptionCarPlay 是用于车载模式时的权限。
        //Options: 参数(枚举类型,通知支持的样式:声音,弹框,横幅,等等)
        
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            NSLog(@"%d--%@", granted, error);
        if (granted | !error) {
            //点击允许
            NSLog(@"注册通知成功");
            [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
                NSLog(@"%@", settings);

                /*
                 获取用户设置 iOS10 提供了获取用户授权相关设置信息的 方法
                 - (void)getNotificationSettingsWithCompletionHandler:(void(^)(UNNotificationSettings *settings))completionHandler;
                 回调带有一个UNNotificationSettings对象,它具有以下属性,可以准确获取各种授权信息:
                 authorizationStatus
                 soundSetting
                 badgeSetting
                 alertSetting
                 notificationCenterSetting
                 lockScreenSetting
                 carPlaySetting
                 alertStyle
              
                 打印信息:   
                 
                 */
            }];
        } else {
            //点击不允许
            NSLog(@"注册通知失败");
        }
        }];
    }else if (IOS8_10){//iOS8-iOS10
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound) categories:nil];
        [application registerUserNotificationSettings:settings];
        [application registerForRemoteNotifications];
    } else {//iOS8以下
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
    }
  
    // 注册APNS, 获取token iOS10, 注册APNS和获取token的方法还和之前一样
    // 在application: didFinishLaunchingWithOptions:调用 registerForRemoteNotifications方法
    //在代理方法application: didRegisterForRemoteNotificationsWithDeviceToken:中获取token
    [[UIApplication sharedApplication] registerForRemoteNotifications];
    return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
     NSLog(@"========================deviceToken:%@",deviceToken);
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error NS_AVAILABLE_IOS(3_0){
    NSLog(@"=========================didFailToRegisterForRemoteNotificationsWithError:%@",error);
}

#//在iOS 10 中,统一使用 UNUserNotificationCenterDelegate的两个delegate方法来获取通知信息。这两个全新的推送代理方法只是在iOS10以上系统上点击通知栏,才回调
#//iOS 10 收到通知不再是在application: didReceiveRemoteNotification:方法去处理,由这两个新的代理方法接收和处理各类通知(本地或者远程)
#//从后台点击通知进入应用的时候回调  回调方法中,获取通知数据(前台类似不做说明)
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(nonnull UNNotificationResponse *)response withCompletionHandler:(nonnull void (^)())completionHandler {
    
    //    NSString* actionIdentifierStr = response.actionIdentifier;
    //    NSLog(@"###############:%@", actionIdentifierStr);
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    NSLog(@"--------%@",userInfo);//这个打印出来的按照翻译应该是 push (远程)的信息和内容(个人认为)
    //消息处理
    //点击action 在 此方法中做相应的处理
    if ([response isKindOfClass:[UNTextInputNotificationResponse class]]) {
        NSString* userSayStr = [(UNTextInputNotificationResponse *)response userText];
        NSLog(@"1111111111111111111%@",userSayStr);
        //这里输出的就是 我们 @“send” 的里面的内容
    }

    UNNotificationContent* content = response.notification.request.content;
    NSLog(@"--------%@",content);
    /*
     这里是我输出的内容  //基本可以获取到通知的全部信息
     >"
     ),
                        badge: 6, 
                        sound: , 
             hasDefaultAction: YES, 
 shouldAddToNotificationsList: YES, 
 shouldAlwaysAlertWhileAppIsForeground: NO, 
             shouldLockDevice: NO, 
             shouldPauseMedia: NO, 
                 isSnoozeable: NO, 
                   fromSnooze: NO, 
       darwinNotificationName: (null), 
darwinSnoozedNotificationName: (null)
 
     */

    NSArray* attachmentsArray = response.notification.request.content.attachments;
    NSLog(@"--------%@",attachmentsArray);//这个打印出来的内容就是上面 打印 attachments: (“打印是这里的”)

    
    // 处理用户与通知交互后的操作,点击跳转网页就是在这里处理 或者到 launchImageName 启动页
    // 这里真实需要处理交互的地方 // 获取通知所带的数据
    // 更新显示的徽章个数
    NSInteger badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
    badge--;
    badge = badge >= 0 ? badge : 0;
    [UIApplication sharedApplication].applicationIconBadgeNumber = badge;
    
    //如果你发送了多条通知,选择其中一条进入APP 那么其他的通知可以删除
    //获取和删除通知
    //这里通知是有两种状态
    //Pending 等待触发的通知
    //Delivered 已经触发展示在通知中心的通知
    
    //获取未触发的通知
    [[UNUserNotificationCenter currentNotificationCenter] getPendingNotificationRequestsWithCompletionHandler:^(NSArray * _Nonnull requests) {
        NSLog(@"pending: %@", requests);
    }];
    
    //获取通知中心列表的通知
    [[UNUserNotificationCenter currentNotificationCenter] getDeliveredNotificationsWithCompletionHandler:^(NSArray * _Nonnull notifications) {
        NSLog(@"Delivered: %@", notifications);
    }];
    
    //清除某一个未触发的通知
    [[UNUserNotificationCenter currentNotificationCenter] removePendingNotificationRequestsWithIdentifiers:@[@"TestRequest1"]];
    //清除某一个通知中心的通知
    [[UNUserNotificationCenter currentNotificationCenter] removeDeliveredNotificationsWithIdentifiers:@[@"TestRequest2"]];
    //对应的删除所有通知
    [[UNUserNotificationCenter currentNotificationCenter] removeAllPendingNotificationRequests];
    [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications];

  
    // 在不需要再推送时,可以取消推送
    if ( [UIApplication sharedApplication].applicationState == UIApplicationStateActive)
    {// 程序在运行过程中受到推送通知
        // TODO
    } else { //在background状态受到推送通知
        // TODO
    }
    
    completionHandler(UIBackgroundFetchResultNewData);
  
}

// 而是在前台的时候回调
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
    
    //应用在前台收到通知
    NSLog(@"========%@", notification);
 
    // 允许在前台展示消息,不设置的话,默认是不行的 注意需要调用completionHandler()
    completionHandler(UNNotificationPresentationOptionAlert|UNNotificationPresentationOptionSound);

}

......

@end

你可能感兴趣的:(iOS 10 通知 + 推送 初级篇(三))