首先介绍一下本文涉及到UserNotifications的几个主要类。

其中

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

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

[3]UNNotificationAttachment是新增的通知内容格式,可以设置图像和视频。Demo中使用说明。

[4]UNNotificationCategory是通知样式类型。在注册通知之后,展示通知之前,可以自定义通知样式,并使用

[[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。极光示例如图

你有30秒的时间处理这个通知,可以同步下载图像和视频到本地,然后包装为一个UNNotificationAttachment扔给通知,这样就能展示用服务器获取的图像或者视频了。这里需要注意:如果数据处理失败,超时,extension会报一个崩溃信息,但是通知会用默认的形式展示出来,app不会崩溃。

[9]UNNotificationSetting没使用,不评论。

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

[11]UNNotificationTrigger通知的触发条件。本Demo仅使用了其中的延时触发功能,其它诸如定时和地理围栏的功能不做说明。地理围栏能可以作为触发条件,就减少了之前需要在地理围栏的delegate中手动添加一个延迟的本地通知的问题。

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

1、通知授权

通知授权部分包括了iOS7 - iOS10。授权方式此处分为两种,一种是苹果原生的注册方法,另一种使用了极光推送的版本。

原生的注册方法:

iOS 10之前的版本不受影响,10版本中使用UNUserNotificationCenter判断用户是否允许app接收通知。如果granted == false,建议弹框提示用户开启通知功能。第一行设置UNUserNotificationCenterDelegate的delegate,可以在AppDelegate中获取两个方法,分别为在app在活跃状态下接收到通知和用户点击action进入app。

极光的注册方法

极光需要输入极光账户中的appKey等信息,此处参照了极光官方文档。

2、通知注册

通知注册的方法在10中被保留,不做修改。

[[UIApplication sharedApplication] registerForRemoteNotifications];

3、获取APNS Token

获取Token的方法在10中被保留,不做修改。由于单一使用极光作为远程推送,token提交部分只有极光的代码。- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {

//  Apns注册成功,该方法没有没有变化。

//  通过JPUSH上传设备Token.

[JPUSHService registerDeviceToken:deviceToken];

}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

[JPUSHService handleRemoteNotification:userInfo];

}

不好意思。实在受够了这个在线版本的图片上传。之后不好在贴图。直接上代码。大家凑合看吧。

4、App获取通知信息。

在iOS10之前,使用didReceiveRemoteNotification:fetchCompletionHandler:方法获取用户信息。

在iOS10中,统一使用UNUserNotificationCenterDelegate的两个delegate方法来获取通知信息。

这里需要注意:如果没有设置UNUserNotificationCenterDelegate的delegate,仍然使用原方法获取用户信息。同时,在获取远程通知的时候,如何没有带mutable-content字段,也在被原方法获取,即使设置了delegate。

本文只讲在需要进app的cation时,触发的event。

delegate方法。注意需要调用completionHandler()

原生版本:

//  iOS10特性。App在前台获取通知

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification*)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {

completionHandler(UNNotificationPresentationOptionAlert);

}

//  iOS10特性。点击通知进入App

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler {

completionHandler()

}

极光版本:

#pragma mark - JPUSHRegisterDelegate

//  只有调用registerForRemoteNotificationConfig:delegate:方法才会激活该delegate。

//  一旦激活该delegate就不再触发application:didReceiveRemoteNotification:fetchCompletionHandler:

//  iOS10特性。App在前台获取通知

1
2
3
4
5
6
7
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger options))completionHandler {
    completionHandler(UNNotificationPresentationOptionAlert);
}
//  iOS10特性。点击通知进入App
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler {
completionHandler()
}

上面基本包括了一个iOS 10通知的使用。已经可以正常获取到推送通知信息。

下面会根据Demo中的示例依次讲解。主要就是贴代码,大家可以直接下载Demo,在代码中会有一些注意事项的说明。

本人写代码基本不写注释。匈牙利流。见谅。

示例顺序如下

@"简单的本地通知",

@"带两个Title的本地通知",

@"带声音的本地通知",

@"带图像的本地通知",

@"带视频的本地通知",

@"不进入应用的按钮",

@"进入应用的按钮",

@"带文本输入框的按钮",

@"自定义通知栏UI",

@"隐藏系统默认消息框",

@"不进App-通知栏UI直接反馈用户操作"

5、简单的本地通知

这是一个最基本的通知激活方法。

从这里可以看到,一个通知基本有content,request,trigger组成。其它的示例只是给content添加更多的内容。

所有的通知都是由[UNUserNotificationCenter currentNotificationCenter]激活。

1
2
3
4
5
6
7
8
9
10
11
12
13
UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
    content.body = @"Hello,world!";
     
    UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5
                                                                                                    repeats:NO];
    NSString* requestIdentifer = @"Request";
    UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:requestIdentifer
                                                                          content:content
                                                                          trigger:trigger];
    [[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request
                                                           withCompletionHandler:^(NSError * _Nullable error) {
                                                               NSLog(@"Error%@", error);
    }];

6、带两个Title的本地通知

该通知携带两个相对新的字段,title和subtitle,都是字符类型。作为标题显示。

这两个字段在iOS8.2之后的通知中被使用,但是只要在watch上的通知可以显示出了。

通知样式:

居然还是得带图。换七牛了。

讲真,真不想上图。可是突然发现字数不够了。

7、带声音的本地通知

使用了新的类UNNotificationSound,添加通知的声音。

该代码中同时使用了badge。在Appdelegate中可以清除。

[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

8、带图像的本地通知

图像必须是bundle包中的,可以下拉通知栏放大图像。

9、带视频的本地通知

之后3个都是关于action的。

10、不进入应用的按钮

11、进入应用的按钮

两者action的区别在UNNotificationActionOptions中。该枚举分3种,分别为

需要解锁显示,红色文字。点击不会进app。

UNNotificationActionOptionAuthenticationRequired = (1 << 0),

黑色文字。点击不会进app。

UNNotificationActionOptionDestructive = (1 << 1),

黑色文字。点击会进app。

UNNotificationActionOptionForeground = (1 << 2),

12、带文本输入框的按钮

其中UNTextInputNotificationAction是UNNotificationAction的子类,初始化方法中分别新增了,键盘右上角的点击按钮文本和文本输入框的默认文字。

点击action在AppDelegate的事件:

NSString* actionIdentifierStr = response.actionIdentifier;

if ([response isKindOfClass:[UNTextInputNotificationResponse class]]) {

NSString* userSayStr = [(UNTextInputNotificationResponse *)response userText];

}

UNNotificationContent* content = response.notification.request.content;

NSDictionary* userInfo = response.notification.request.content.userInfo;

UNNotificationAttachment* attachments = response.notification.request.content.attachments;

基本从以前可以获取到通知的全部信息。

13、自定义的通知栏UI

需要新建一个Notification Content。可以创建多个,但是需要设定不同的category。参照Demo。同一个content可以设置多个category。

默认的NotificationContent的VC中,默认有两个方法。分别为viewDidLoad和didReceiveNotification。前者渲染UI,后者获取通知信息,更新UI控件中的数据。

14、隐藏默认的消息栏。

系统消息栏会默认出现在下方。如果你已经自定义的显示的控件,就显得多余,可以隐藏默认。

//  隐藏默认消息框。添加UNNotificationExtensionDefaultContentHidden属性,Bool(YES).

15、不进App在通知栏上反馈用户的操作。

需要执行UNNotificationContentExtension的delegate方法didReceiveNotificationResponse:completionHandler:

这里注意:必须对全部的action进行处理。必须设置completion,否则通知不会消失。

创建通知代码

处理通知的代码。在自定义的NotificaitonContent中

16、获取远程通知后进行处理显示。此处以远程通知发送一个image的uri,通知显示图片为例。

需要添加一个新的target Notification Service extension。

这里的extension需要在info.plist中设置HTTP。

iOS 10 推送的简单使用的更多相关文章

  1. iOS 10推送通知开发

    原文地址:Developing Push Notifications for iOS 10,译者:李剑飞 虽然通知经常被过度使用,但是通知确实是一种获得用户关注和通知他们需要更新或行动的有效方式.iO ...

  2. 玩转 iOS 10 推送 —— UserNotifications Framework(合集)

    iOS 10 came 在今年 6月14号 苹果开发者大会 WWDC 2016 之后,笔者赶紧就去 apple 的开发者网站下载了最新的 Xcode 8 beta 和 iOS 10 beta,然后在自 ...

  3. iOS 10 推送全解析,注意事项

    本文旨在对 iOS 推送进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解.以下是 pikacode 使用 iOS ...

  4. iOS 10 推送必看(高阶1)

    来源:徐不同 链接:http://www.jianshu.com/p/3d602a60ca4f iOS10 推送必看(基础篇) 虽然这篇文章比较长,也不好理解,但是还是建议大家收藏,以后用到的时候,可 ...

  5. iOS消息推送相关

    远程推送 iOS开发之实现App消息推送:http://blog.csdn.net/shenjie12345678/article/details/41120637 国内90%以上的iOS开发者,对A ...

  6. 了解iOS消息推送一文就够:史上最全iOS Push技术详解

    本文作者:陈裕发, 腾讯系统测试工程师,由腾讯WeTest整理发表. 1.引言 开发iOS系统中的Push推送,通常有以下3种情况: 1)在线Push:比如QQ.微信等IM界面处于前台时,聊天消息和指 ...

  7. 使用PushSharp给iOS应用推送消息

    PushSharp是一个C#编写的服务端类库,用于推送消息到各种客户端,支持iOS(iPhone/iPad).Android.Windows Phone.Windows 8.Amazo.Blackbe ...

  8. (转载)iOS 极光推送SDK 集成指南

    iOS SDK 集成指南 使用提示 本文匹配的 SDK版本:r1.2.5 以后. 查看最近更新了解最新的SDK更新情况. 产品功能说明 极光推送(JPush)是一个端到端的推送服务,使得服务器端消息能 ...

  9. Ios 消息推送

    手把手教你做iOS推送 http://www.cocoachina.com/industry/20130321/5862.html http://www.cnblogs.com/cdts_change ...

随机推荐

  1. 细说gulp

    一.概述&安装 Gulp,简而言之,就是前端自动化开发工具,利用它,我们可以提高开发效率. 比如: 1.  压缩js 2.  压缩css 3.  压缩less 4.  压缩图片 等等… 我们完 ...

  2. 窥探Swift之使用Web浏览器编译Swift代码以及Swift中的泛型

    有的小伙伴会问:博主,没有Mac怎么学Swift语言呢,我想学Swift,但前提得买个Mac.非也,非也.如果你想了解或者初步学习Swift语言的话,你可以登录这个网站:http://swiftstu ...

  3. iOS开发之各种动画各种页面切面效果

    因工作原因,有段时间没发表博客了,今天就发表篇博客给大家带来一些干货,切勿错过哦.今天所介绍的主题是关于动画的,在之前的博客中也有用到动画的地方,今天就好好的总结一下iOS开发中常用的动画.说道动画其 ...

  4. ASP.NET MVC 6 一些不晓得的写法

    今天在看 Scott Guthrie 的一篇博文<Introducing ASP.NET 5>,在 MVC 6 中,发现有些之前不晓得的写法,这边简单记录下,算是对自己知识的补充,有些我并 ...

  5. ECharts使用心得

    ECharts百度旗下图标插件,在展示地图.雷达图等方面有很好的支持. 应用场景: 自动生成X轴的数据: 设置:xAxis的type=value || type=time 并且设置series的dat ...

  6. 安装nginx

    [yum安装nginx] yum clean all(这步不执行会出现no more mirrors to try错误) cd /etc/yum.repos.d/ vi nginx.repo 填写 [ ...

  7. 【解决】查询无法完成,因为其包含的查找列数已超过管理员强制实施的查找列阈值。Error code=0x80070093; Error source=Groove

    前因: 修改了SharePoint Server 2013 下面的文档库的名称,原先2个汉字,现在8个汉字.结果,SkyDrive Pro 就无法同步了,无论是停止重新同步还是手动填写进行同步都不可以 ...

  8. String的按值传递,java传参都是传值

    java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? String和int参数传递是按值传递还是引用传递? 一道面试题目,String的传递: public String change( ...

  9. Delphi TListView刷新闪烁问题

    应用场景 TListView可以动态选择列并显示而且列宽度也要保存,加载数据ListView会出现N次闪烁 步骤一: 选择要显示列: 点击"确定"按钮,显示下图 步骤二: 界面会出 ...

  10. SEO技巧之WordPress篇幅

    随着搜索引擎大兴, 排列在前的网站引入大量流量. 无论是搜索页面的广告还是查出来的结果, 与搜索者的目标匹配度都比较高 (如果搜索引擎足够智能), 所以通过搜索引擎而来的访客很可能会从网站上得到他想要 ...