zoukankan      html  css  js  c++  java
  • 【转】iOS 10 UserNotifications 使用说明

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

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

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

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

    其中

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

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

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

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

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

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

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

     

    1、通知授权

    通知授权部分包括了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等信息,此处参照了极光官方文档。

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

    通知样式:

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

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


    7、带声音的本地通知

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

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

    [[UIApplication sharedApplicationsetApplicationIconBadgeNumber: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在通知栏上反馈用户的操作。

    需要执行UNNotificationContentExtensiondelegate方法didReceiveNotificationResponse:completionHandler:

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

    创建通知代码

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

     

    16、获取远程通知后进行处理显示。此处以远程通知发送一个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=

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

  • 相关阅读:
    git 服务器的搭建
    两种读写配置文件的方案(app.config与web.config通用)
    实现UniqueAttribute唯一性约束-优化版
    实现UniqueAttribute唯一性约束
    WCF会话(Session)与实例(Instance)管理
    WCF实现方法重载
    WCF序列化
    WCF服务创建与使用(双工模式)
    WCF服务创建与使用(请求应答模式)
    我的WCF学习与强化系列文章
  • 原文地址:https://www.cnblogs.com/zhw511006/p/6197497.html
Copyright © 2011-2022 走看看