iOS 10 UserNotifications 使用说明

本教程以贴代码为主。尽量直观,少许说明。git

注意:XCode8的须要手动开启主target Capabilities中的Push Notification。github

关于建立多个target后真机测试的证书问题,除了主target手动建立开发和发布证书,并设置了APNS证书外,其它均使用Automatically manage signing。服务器

 

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

屏幕快照 2016-09-24 下午6.50.33.png

其中ide

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

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

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

[4]UNNotificationCategory是通知样式类型。在注册通知以后,展现通知以前,能够自定义通知样式,并使用spa

[[UNUserNotificationCenter currentNotificationCentersetNotificationCategories:[NSSetsetWithObject:categoryNotification]]设置到通知中心中。根据通知内容中的categoryIdentifier使用不一样的通知样式。这里须要注意:使用自定义的通知操做按钮和通知Content能够设置为同一个category。code

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

屏幕快照 2016-09-24 下午7.11.45.png

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

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

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

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

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

 

一、通知受权

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

原生的注册方法:

屏幕快照 2016-09-24 下午6.47.28.png

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

极光的注册方法

屏幕快照 2016-09-24 下午7.24.54.png

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

 

二、通知注册

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

[[UIApplication sharedApplicationregisterForRemoteNotifications];

 

三、获取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];

}

 

很差意思。实在受够了这个在线版本的图片上传。以后很差在贴图。直接上代码。你们凑合看吧。

 

四、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直接反馈用户操做"

 

五、简单的本地通知

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

从这里能够看到,一个通知基本有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);
     }];

 

 

六、带两个Title的本地通知

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

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

通知样式:

竟然仍是得带图。换七牛了。

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


七、带声音的本地通知

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

该代码中同时使用了badge。在Appdelegate中能够清除。

[[UIApplication sharedApplicationsetApplicationIconBadgeNumber:0];

 

 

八、带图像的本地通知

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

九、带视频的本地通知

 

以后3个都是关于action的。

十、不进入应用的按钮

十一、进入应用的按钮

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

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

UNNotificationActionOptionAuthenticationRequired = (1 << 0),

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

UNNotificationActionOptionDestructive = (1 << 1),

黑色文字。点击会进app。    

UNNotificationActionOptionForeground = (1 << 2),

十二、带文本输入框的按钮

其中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;

基本从之前能够获取到通知的所有信息。

 

1三、自定义的通知栏UI

须要新建一个Notification Content。能够建立多个,可是须要设定不一样的category。参照Demo。同一个content能够设置多个category。

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

1四、隐藏默认的消息栏。

系统消息栏会默认出如今下方。若是你已经自定义的显示的控件,就显得多余,能够隐藏默认。

 

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

 

1五、不进App在通知栏上反馈用户的操做。

须要执行UNNotificationContentExtensiondelegate方法didReceiveNotificationResponse:completionHandler:

这里注意:必须对所有的action进行处理。必须设置completion,不然通知不会消失。

建立通知代码

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

 

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

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

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

但愿对你们有帮助。

Demo地址:

github: https://github.com/JiLaqi/NotificationCenterDemo

qiniu:http://7xpxop.com1.z0.glb.clouddn.com/NotificationCenter.zip?attname=

相关文章
相关标签/搜索