【转】iOS 10 UserNotifications 使用说明

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

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

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

【转】iOS 10 UserNotifications 使用说明

其中

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

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

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

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

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

【转】iOS 10 UserNotifications 使用说明

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

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

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

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

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

 

1、通知授权

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

原生的注册方法:

【转】iOS 10 UserNotifications 使用说明

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

极光的注册方法

【转】iOS 10 UserNotifications 使用说明

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

2、通知注册

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

[[UIApplication sharedApplicationregisterForRemoteNotifications];

 

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上的通知可以显示出了。

通知样式:

【转】iOS 10 UserNotifications 使用说明

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

【转】iOS 10 UserNotifications 使用说明

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


7、带声音的本地通知

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

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

[[UIApplication sharedApplicationsetApplicationIconBadgeNumber:0];

【转】iOS 10 UserNotifications 使用说明

 

 

8、带图像的本地通知

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

【转】iOS 10 UserNotifications 使用说明

【转】iOS 10 UserNotifications 使用说明

【转】iOS 10 UserNotifications 使用说明

9、带视频的本地通知

【转】iOS 10 UserNotifications 使用说明

【转】iOS 10 UserNotifications 使用说明

 

之后3个都是关于action的。

10、不进入应用的按钮

【转】iOS 10 UserNotifications 使用说明

11、进入应用的按钮

【转】iOS 10 UserNotifications 使用说明

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

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

UNNotificationActionOptionAuthenticationRequired = (1 << 0),

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

UNNotificationActionOptionDestructive = (1 << 1),

黑色文字。点击会进app。    

UNNotificationActionOptionForeground = (1 << 2),

【转】iOS 10 UserNotifications 使用说明

12、带文本输入框的按钮

【转】iOS 10 UserNotifications 使用说明

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

【转】iOS 10 UserNotifications 使用说明

点击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。

【转】iOS 10 UserNotifications 使用说明

【转】iOS 10 UserNotifications 使用说明

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

【转】iOS 10 UserNotifications 使用说明

14、隐藏默认的消息栏。

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

 

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

【转】iOS 10 UserNotifications 使用说明

 

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

需要执行UNNotificationContentExtensiondelegate方法didReceiveNotificationResponse:completionHandler:

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

创建通知代码

【转】iOS 10 UserNotifications 使用说明处理通知的代码。在自定义的NotificaitonContent中

【转】iOS 10 UserNotifications 使用说明

 

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

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

【转】iOS 10 UserNotifications 使用说明

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

希望对大家有帮助。

Demo地址:

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

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

http://www.cocoachina.com/ios/20160926/17645.html