iOS 10 UserNotifications使用笔记

iOS 推送分为 Local Notifications(本地推送) 和 Remote Notifications(远程推送)以及ios7之后的静默推送

本地推送:本地推送通过 App 本地定制,加入到系统的 Schedule 里,然后在指定的时间推送指定文字。

远程推送:远程推送通过服务端向苹果推送服务器 Apple Push Notification Service (APNs) 发送 Notification Payload,之后 APNs 再将推送下发到指定设备的 指定 App 上。

静默推送:不显式地弹窗打扰用户。

通知使用的是UserNotifications框架,下面是这个框架中个个类的功能

/*主要是作为通知delegate方法的参数使用。包含UNNotificationRequest信息。*/
UNNotification

/*通知栏中添加的action,默认以的button样式展示。有一个文本输入的子类UNTextInputNotificationAction。可以在点击button之后弹出一个键盘,输入信息。用户点击信息和输入的信息可以在UNNotificationResponse中获取。*/
UNNotificationAction

/*新增的通知内容格式,可以设置图像和视频。*/
UNNotificationAttachment

/*通知样式类型。在注册通知之后,展示通知之前,可以自定义通知样式,并使用
[[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[NSSet setWithObject:categoryNotification]]设置到通知中心中。根据通知内容中的categoryIdentifier使用不同的通知样式。这里需要注意:使用自定义的通知操作按钮和通知Content可以设置为同一个category。*/
UNNotificationCategory

/*通知的主体内容,原通知的title,sound,badge和新的attachments,lacnchImageName都在这里进行设置,是创建一个通知的前提。*/
UNNotificationContent

/*通知请求。当通知内容,触发条件都准备好之后,需要包装为一个通知请求,由通知中心来激活这个通知。*/
UNNotificationRequest

/*通知响应。作为通知的action被用户触发之后,App可以拿到的信息。和action对应,有普通的UNNotificationResponse和子类UNTextInputNotificationResponse。其中包括action的identifier和完整的UNNotification。子类UNTextInputNotificationResponse还包含userText,用户输入的内容。*/
UNNotificationResponse

/*一个extension。用户可以在收到特性的通知时(一般是远程,并且该远程通知的apns中包含一个mutable-content字段,值为1)你有30秒的时间处理这个通知,可以同步下载图像和视频到本地,然后包装为一个UNNotificationAttachment扔给通知,这样就能展示用服务器获取的图像或者视频了。这里需要注意:如果数据处理失败,超时,extension会报一个崩溃信息,但是通知会用默认的形式展示出来,app不会崩溃。*/
UNNotificationServiceExtension


UNNotificationSetting目前只知道可以获取用户的设定

/*通知的声音。可以直接使用声音的name,而不是文件路径。*/
UNNotificationSound

/*通知的触发条件。*/
UNNotificationTrigger

/*通知中心。最主要的类,通知的注册,激活,编辑,删除等功能都由该类完成。*/
UNUserNotificationCenter

 

本地推送

流程:

通过定义content(通知内容) 和Trigger(通知的触发条件)向 UNUserNotificationCenter 进行 request 这三部曲来实现

0:申请通知权限

1:创建通知内容

2:创建通知触发条件

3:创建通知请求

4:将请求加入通知中心

示例:

// ios10以前申请通知权限
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
    [application registerUserNotificationSettings:settings]; 


// 申请通知权限ios10
    [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
    
        if (granted) {
    
            // 一、创建通知内容,注:这里得用可变类型的UNMutableNotificationContent,否则内容的属性是只读的
            UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
            // 标题
            content.title = @"通知标题";
            // 次标题
            content.subtitle = @"通知副标题";
            // 内容
            content.body = @"通知文字内容";
            // app显示通知数量的角标
            content.badge = @(333);
            // 通知的提示声音,这里用的默认的声音
            content.sound = [UNNotificationSound defaultSound];
            
            // 通知附件(可以是图片、视频、音频)
            NSURL *imageUrl = [[NSBundle mainBundle] URLForResource:@"xue.jpg" withExtension:nil];
            UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:@"imageIndetifier" URL:imageUrl options:nil error:nil];
            
            // 附件 可以是音频、图片、视频 这里是一张图片
            content.attachments = @[attachment];
            
            // 标识符
            content.categoryIdentifier = @"categoryIndentifier";
            
            // 二、创建通知触发条件
            /* 触发器分三种:
             UNTimeIntervalNotificationTrigger :(按秒触发) 在一定时间后触发,如果设置重复的话,timeInterval不能小于60
             UNCalendarNotificationTrigger : (按日期触发)在某天某时触发,可重复
             UNLocationNotificationTrigger :(按地理位置触发) 进入或离开某个地理区域时触发
             */
            UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];
            
            // 三、创建通知请求
            UNNotificationRequest *notificationRequest = [UNNotificationRequest requestWithIdentifier:@"ceshiNotification" content:content trigger:trigger];
            
            // 四、将请求加入通知中心
            [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:notificationRequest withCompletionHandler:^(NSError * _Nullable error) {
                if (error == nil) {
                    NSLog(@"已成功加推送%@",notificationRequest.identifier);
                }
            }];
        }
        
    }];

截图:

 

远程推送:

流程:

1、注册通知

2、获取Device Token

3、监听通知的接受与,点击

系统自带处理通知的方法:

// 第一步、在Appdelegate.m中导入#import <UserNotifications/UserNotifications.h>
// 遵守<UNUserNotificationCenterDelegate>的协议,为了监听通知的接受与点击事件。

// 第二步、在 (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中注册通知

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) {
        //iOS10特有
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        // 必须写代理,不然无法监听通知的接收与点击
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if (granted) {
                // 点击允许
                NSLog(@"获取用户权限成功");
                [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
                    NSLog(@"%@", settings);
                }];
            } else {
                // 点击不允许
                NSLog(@"获取用户权限失败");
            }
        }];
    }else if ([[UIDevice currentDevice].systemVersion floatValue] >8.0){
        //iOS8 - iOS10
        [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil]];

    }
    // 注册获得device Token
    [[UIApplication sharedApplication] registerForRemoteNotifications];

// 第三步、
// 获得Device Token
 - (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSLog(@"%@", [NSString stringWithFormat:@"Device Token: %@", deviceToken]);
}
// 获得Device Token失败
- (void)application:(UIApplication *)application
didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error);
}

// 第四步、通知的监听,通知点击事件的监听
// UNUserNotificationCenterDelegate

// iOS 10收到通知
- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{
    NSDictionary * userInfo = notification.request.content.userInfo;
    UNNotificationRequest *request = notification.request; // 收到推送的请求
    UNNotificationContent *content = request.content; // 收到推送的消息内容
    NSNumber *badge = content.badge;  // 推送消息的角标
    NSString *body = content.body;    // 推送消息体
    UNNotificationSound *sound = content.sound;  // 推送消息的声音
    NSString *subtitle = content.subtitle;  // 推送消息的副标题
    NSString *title = content.title;  // 推送消息的标题

    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        NSLog(@"iOS10 前台收到远程通知:%@", [self logDic:userInfo]);

    }
    else {
        // 判断为本地通知
        NSLog(@"iOS10 前台收到本地通知:{\\\\nbody:%@,\\\\ntitle:%@,\\\\nsubtitle:%@,\\\\nbadge:%@,\\\\nsound:%@,\\\\nuserInfo:%@\\\\n}",body,title,subtitle,badge,sound,userInfo);
    }
    completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以设置
}

// 通知的点击事件
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{

    NSDictionary * userInfo = response.notification.request.content.userInfo;
    UNNotificationRequest *request = response.notification.request; // 收到推送的请求
    UNNotificationContent *content = request.content; // 收到推送的消息内容
    NSNumber *badge = content.badge;  // 推送消息的角标
    NSString *body = content.body;    // 推送消息体
    UNNotificationSound *sound = content.sound;  // 推送消息的声音
    NSString *subtitle = content.subtitle;  // 推送消息的副标题
    NSString *title = content.title;  // 推送消息的标题
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        NSLog(@"iOS10 收到远程通知:%@", [self logDic:userInfo]);

    }
    else {
        // 判断为本地通知
        NSLog(@"iOS10 收到本地通知:{\\\\nbody:%@,\\\\ntitle:%@,\\\\nsubtitle:%@,\\\\nbadge:%@,\\\\nsound:%@,\\\\nuserInfo:%@\\\\n}",body,title,subtitle,badge,sound,userInfo);
    }

    // Warning: UNUserNotificationCenter delegate received call to -userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler: but the completion handler was never called.
    completionHandler();  // 系统要求执行这个方法

}

上面方法参数response对象的结构:

集成极光推送:

https://docs.jiguang.cn/jpush/client/iOS/ios_sdk/

极光官网的文档写的很详细,按着一步步来就行了。

极光与个推都使用了个子平台的服务器与用户app建立长连接(app在前台的时候),这样做是为了弥补APN推送的延时,只是极光叫:消息;个推叫:透传

 

转载于:https://my.oschina.net/yejiexiaobai/blog/1529771

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值