澳门威利斯人_威利斯人娱乐「手机版」

来自 威利斯人娱乐 2020-03-25 17:53 的文章
当前位置: 澳门威利斯人 > 威利斯人娱乐 > 正文

通知推送,消息推送

上一篇博客iOS 10 新闻推送(UserNotifications)秘技计算发布后被 简书编辑推荐至首页,那着实让自己如获至宝啊。可是好事相当短,后边产生了让自个儿泣不成声的事,作者的女对象不要自身了%>_<%。刚刚放完国庆假期,你们还沉浸在国庆的合意中没回过神来,而自己则迷失了向上的矛头自甘堕落,未有了寄托和爱怜的不得了人了!

1、UserNotifications

  • 布告是 App 用来和客户交换的一种方法,特别是当 App 并不以往在前台运维的时候。布告,正如它的称号所重申的,被看作向客商‘布告’三个事变,也许仅仅向客商提醒一条第一新闻。简单来说,公告在提示类型的 App 个中十一分有用,以至在一些别的类型的 App 个中也是那样。比方,当顾客步入四个点名区域(那是 iOS8 的新特色),贰个下载职分成功,或许当对象给您发送一条新闻的时候,一条公告就足以被呈现出来。不论怎么样,布告的目标正是获取客户的关心,然后他们就能够管理通报了。

  • 从 iOS8 起头,本质上的话有二种推送通知 Local Notifications(本地推送) 和 Remote Notifications(远程推送)。

    • 地方推送公告(Local Notifications):由开辟者定义,App 触发,触发的时刻是被事情发生以前安排好的。
      • 地点布告(Location Notifications),iOS8 引进,然而她们只会在客商一个特定的地理也许 iBeacon 区域时,才会被触发,即使大家看不到什么细节。
    • 长间距推送公告(Remote Notifications):这种情状下,布告能够被分为七个门类。
      • 推送通告(The push notifications),棉被和衣服务器开首化,然后通过 APNS,最后到达顾客设备。
      • 沉吟不语布告(The silent notifications),其实也是推送公告,不过她们并不曾被突显给客商,而是马上被 App 管理以倡导某项职分,最终当一切都成功时,三个当地通告被出示以提醒客商。

  • iOS 10 中校事情发生前胡言乱语的推送通告统一成 UserNotifications.framework 来聚集管理和接受通知成效,还增添部分实用的效率——撤回单条文告、更新已展现布告、中途改良布告内容、在布告中显示多媒体能源、自定义 UI 等成效,功用实在强大。

  • 在客商平时生活中会有很三种动静需求文告,例如:新闻提醒、依期吃药、准期体格检查、达到某些地点提醒客户等等,那一个效应在 UserNotifications 中都提供了对应的接口。

    图片 1

  • Local Notifications(本地推送)

    图片 2

    • App 本地创制公告,参加到系统的 Schedule(布署表)里,就算触发器条件达到规定的标准期会推送相应的音讯内容。
  • Remote Notifications(远程推送)

    图片 3

    • 图中,Provider 是指有些 华为 软件的 Push 服务器。APNS 是 Apple Push Notification Service(Apple Push 服务器)的缩写,是苹果的服务器。

    • 上海体育场地能够分成四个阶段:

      • 先是品级:APNS Pusher 应用程序把要发送的信息、指标 索尼爱立信的标识打包,发给 APNS。
      • 其次品级:APNS 在自己的已注册 Push 服务的 摩托罗拉列表中,查找有相应标志的 索尼爱立信,并把消息发到 小米。
      • 其三等级:HUAWEI 把发来的音信传递给相应的应用程序, 而且依据设定弹出 Push 公告。
    • 长间隔推送创立流程

      图片 4

      • 从上海体育场地大家能够见见:

        • 首先是应用程序注册新闻推送。
        • iOS 跟 APNS Server 要 deviceToken。应用程序选择deviceToken。
        • 应用程序将 deviceToken 发送给 Push 服务器端程序。
        • Push 服务器端程序向 APNS 发送推送消息。
        • APNS 将推送音信发送给 一加 应用程序。
  • 简介
  • UNNotification瑟维斯Extension - 通告服务扩展
  • UNNotificationContentExtension - 通告内容扩大

情爱中最可惜的事大致正是那般呢我们曾爱的人到撕心裂肺,但不仅仅都在相互加害,什么人也不懂退让,也不会给对方包容,相守相杀演绎到了有加无己而分手,因为那时候我们相守太早了,浑身带刺,根本不可能给对方想要的生活格局,劳燕分飞时是一种成全,更是一种脱位。但是多年的情绪放手真的那么轻便啊?笔者深信地球是圆的,再通过了累累折腾之后重新重逢,那个时候的大家会带着打磨好的慈爱相互赏识,不会再为了什么人洗碗那样的小事而争吵,不会再用讲话加害最爱的人!

2、本地推送

  • 本地推送重要流程:

    • 1 申请本地推送
    • 2 创设三个触发器(trigger)
    • 3 成立推送的剧情(UNMutableNotificationContent)
    • 4 创立推送诉求(UNNotificationRequest)
    • 5 推送乞请加多到推送管理中央(UNUserNotificationCenter)中

<h2 ></h2>

自家愿意有个如你相似的人。如这山间深夜相符领会舒心的人,如奔赴古村落道路上阳光常常的人,温暖而不炙热,覆盖小编具有肌肤。由起源到晚上,由山野到书房,一切难点的答案都很简短。小编梦想有个如您相同的人,贯彻未来,数遍生命的公路牌。只要最终是你,就好

2.1 申请本地推送

  • 1、导入头文件,且要严守左券。这里须要专心,富含头文件大家最棒写成这种格局,幸免低版本找不到底文件现身难题。

        // 包含头文件
        #ifdef NSFoundationVersionNumber_iOS_9_x_Max
        #import <UserNotifications/UserNotifications.h>
        #endif
    
        // 遵守协议
        <UNUserNotificationCenterDelegate>
    
  • 2、在 application:didFinishLaunchingWithOptions: 中申请文告权限。

        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    
            // 设置代理,必须写代理,不然无法监听通知的接收与点击事件
            center.delegate = self;
    
            // 判断是否已申请通知权限
            [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
    
                if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined ||
                    settings.authorizationStatus == UNAuthorizationStatusDenied) {
    
                    // 申请通知权限
                    [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge |
                                                             UNAuthorizationOptionSound |
                                                             UNAuthorizationOptionAlert )
                                          completionHandler:^(BOOL granted, NSError * _Nullable error) {
    
                        if (!error && granted) {
    
                            // 用户点击允许
                            NSLog(@"注册成功");
                        } else {
    
                            // 用户点击不允许
                            NSLog(@"注册失败");
                        }
                    }];
                }
            }];
    
            return YES;
        }
    
    • 地点供给注意:

          1. 必须写代理,不然无法监听通知的接收与点击事件
              center.delegate = self;
      
          2. 之前注册推送服务,用户点击了同意还是不同意,以及用户之后又做了怎样的更改我们都无从得知,现在 apple 开放了这个 API,我们可以直接获取到用户的设定信息了。
             注意 UNNotificationSettings 是只读对象哦,不能直接修改!只能通过以下方式获取
      
              [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
                  NSLog(@"%@",settings);
              }];
      

简介

那篇作品首要讲iOS10推送布告的三个扩张框架:UNNotificationServiceExtensionUNNotificationContentExtension。有关iOS10推送通告的新特征,请看这里

图片 5xcode-unnotification-extension.jpeg

  • UNNotificationServiceExtension是在收受公告后,展现通告前,做一些业务的。举个例子,扩充附件,网络央求等。
  • 想要给通告创立一个自定义的顾客分界面,需要UNNotificationContentExtension。

<h2 ></h2>

图片 6孤独的loser.jpg

2.2 选拔处理推送音信

  • iOS 10 系统立异时,苹果给了我们 2 个代理方法来管理通报的收纳和点击事件。

        @protocol UNUserNotificationCenterDelegate
    
        @optional
    
        // The method will be called on the delegate only if the application is in the foreground. If the method 
        is not implemented or the handler is not called in a timely manner then the notification will not be 
        presented. The application can choose to have the notification presented as a sound, badge, alert and/or 
        in the notification list. This decision should be based on whether the information in the notification 
        is otherwise visible to the user.
    
        - (void)userNotificationCenter:(UNUserNotificationCenter *)center 
               willPresentNotification:(UNNotification *)notification 
                 withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler 
                 __IOS_AVAILABLE(10.0) __TVOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0);
    
        // The method will be called on the delegate when the user responded to the notification by opening the 
        application, dismissing the notification or choosing a UNNotificationAction. The delegate must be set 
        before the application returns from applicationDidFinishLaunching:.
    
        - (void)userNotificationCenter:(UNUserNotificationCenter *)center 
                didReceiveNotificationResponse:(UNNotificationResponse *)response 
                         withCompletionHandler:(void(^)())completionHandler 
                         __IOS_AVAILABLE(10.0) __WATCHOS_AVAILABLE(3.0) __TVOS_PROHIBITED;
    
        @end
    
  • 此外,苹果把地方文告跟远程通告融合为一。区分本地通告跟远程通告的类是 UNPushNotificationTrigger.h 类中,UNPushNotificationTrigger 的品种是新增的,通过它,大家得以获得部分通报的接触条件 ,解释如下:

    • UNPushNotificationTrigger :(远程布告)远程推送的文告类型。
    • UNTimeIntervalNotificationTrigger :(本地文告)一准时间之后,重复只怕不重复推送公告。大家得以安装 timeInterval(时间隔开分离)和 repeats(是还是不是再次)。
    • UNCalendarNotificationTrigger :(本地公告)一定日期现在,重复也许不重复推送布告 举个例子,你每一天8 点推送一个文告,只要 dateComponents 为 8,若是您想天天 8 点都推送这么些公告,只要 repeats 为 YES 就能够了。
    • UNLocationNotificationTrigger :(本地公告)地理地点的一种布告,当顾客步入或离开三个地理区域来打招呼。
  • 亟需小心的

        1. 下面这个代理方法,只会是 app 处于前台状态下才会走,后台模式下是不会走这里的。
            - (void)userNotificationCenter:(UNUserNotificationCenter *)center 
                   willPresentNotification:(UNNotification *)notification 
                     withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler
    
        2. 下面这个代理方法,用户点击消息时会触发,点击 Action 按钮时也会触发。点击消息时默认会打开 App。
            - (void)userNotificationCenter:(UNUserNotificationCenter *)center 
                   didReceiveNotificationResponse:(UNNotificationResponse *)response 
                            withCompletionHandler:(void (^)())completionHandler
    
        3. 不管前台后台状态下,推送消息的横幅都可以展示出来。后台状态不用说,前台时需要在前台代理方法中设置,选择是否提醒用户。
            completionHandler(UNNotificationPresentationOptionBadge 
                            | UNNotificationPresentationOptionSound
                            | UNNotificationPresentationOptionAlert);
    
        4. 点击代理最后需要执行:completionHandler(); 不然会报错。
            2016-09-27 14:42:16.353978 UserNotificationsDemo[1765:800117] Warning: UNUserNotificationCenter delegate 
            received call to -userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler: but the 
            completion handler was never called.
    
  • 抽取管理地方和长途推送音讯

        // AppDelegate.m
    
        // UNUserNotificationCenterDelegate 协议方法,App 处于前台接收通知
        - (void)userNotificationCenter:(UNUserNotificationCenter *)center 
               willPresentNotification:(UNNotification *)notification 
                 withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
    
            // 收到推送的请求
            UNNotificationRequest *request = notification.request;
    
            // 收到推送的内容
            UNNotificationContent *content = request.content;
    
            // 收到用户的基本信息
            NSDictionary *userInfo = content.userInfo;
    
            // 收到推送消息的角标
            NSNumber *badge = content.badge;
    
            // 收到推送消息 body
            NSString *body = content.body;
    
            // 推送消息的声音
            UNNotificationSound *sound = content.sound;
    
            // 推送消息的副标题
            NSString *subtitle = content.subtitle;
    
            // 推送消息的标题
            NSString *title = content.title;
    
            if ([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    
                // 收到远程推送消息
                NSLog(@"收到远程推送消息: %@", userInfo);
    
            } else {
    
                // 收到本地推送消息
                NSLog(@"收到本地推送消息: %@", userInfo);
            }
    
            // 需要执行这个方法,选择是否提醒用户,有 Badge、Sound、Alert 三种类型可以设置
            completionHandler(UNNotificationPresentationOptionBadge 
                            | UNNotificationPresentationOptionSound 
                            | UNNotificationPresentationOptionAlert);
        }
    
  • 拍卖推送音信点击事件

        // AppDelegate.m
    
        // UNUserNotificationCenterDelegate 协议方法
        - (void)userNotificationCenter:(UNUserNotificationCenter *)center 
                didReceiveNotificationResponse:(UNNotificationResponse *)response 
                         withCompletionHandler:(void (^)())completionHandler{
    
            // 收到推送的请求
            UNNotificationRequest *request = response.notification.request;
    
            // 收到推送的内容
            UNNotificationContent *content = request.content;
    
            // 收到用户的基本信息
            NSDictionary *userInfo = content.userInfo;
    
            // 收到推送消息的角标
            NSNumber *badge = content.badge;
    
            // 收到推送消息 body
            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(@"点击远程推送消息: %@", userInfo);
    
            } else {
    
                // 本地推送消息
                NSLog(@"点击本地推送消息: %@", userInfo);
            }
    
            // 系统要求执行这个方法
            completionHandler(); 
        }
    

UNNotification瑟维斯Extension - 文告服务扩张

设若通常应用iMessage的对象们,就能够通常收到部分音讯,附带了有些肖像可能摄像,所以推送中能附带那些多媒体是不行重大的。若是推送中蕴含了那么些多媒体消息,可以使顾客毫无张开app,不用下载就能够高速浏览到剧情。有目共睹,推送布告中带了push payload,尽管z2018年苹果已经把payload的size升高到了4k bites,可是这么小的体积也无从使顾客能发送一张高清的图片,以至把那张图的缩略图蕴涵在推送布告里面,也不必然放的下去。在iOS X中,我们能够动用新特色来肃清这一个标题。大家能够经过新的service extensions来缓和那一个主题材料。

iOS10给布告增多附属类小零部件有二种情况:当地布告和远程通告。

  1. 地面推送文告,只需给content.attachments设置UNNotificationAttachment附件对象
  2. 远程推送布告,需求完成UNNotificationServiceExtension,在回调方法中管理 推送内容时设置 request.content.attachments 属性,之后调用 contentHandler 方法就能够。

UNNotificationServiceExtension 提供在中间距推送将在被 push 出来前,管理推送展现内容的机缘。那时候得以对通报的 request.content 进行内容足够,如加多附属类小零部件,userInfo 等。下图突显了Notification ServiceExtension的流水线:

图片 7unnotification-service-extension.jpg

拍卖的内部原因如下:

1.为了能在service extension 里面包车型地铁attachment,必需给apns扩张"mutable-content":1 字段,使您的推送文告是动态可变的。

{ "aps":{ "alert":"Testing.. ", "badge":1, "sound":"default", "mutable-content":1 }}

2.给项目新建四个Notification Service Extension的扩张。

3.在-didReceiveNotificationRequest:withContentHandler:方法中拍卖request.content,用来给通告的剧情做改良。如面代码示例了收到公告后,给布告扩大图片附属类小零器件:

- didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(UNNotificationContent * _Nonnull))contentHandler { self.contentHandler = contentHandler; self.bestAttemptContent = [request.content mutableCopy]; self.bestAttemptContent.title = [NSString stringWithFormat:@"%@ [modified]", self.bestAttemptContent.title]; //1. 下载 NSURL *url = [NSURL URLWithString:@"http://img1.gtimg.com/sports/pics/hv1/194/44/2136/138904814.jpg"]; NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; NSURLSessionDataTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if  { //2. 保存数据 NSString *path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"download/image.jpg"]; UIImage *image = [UIImage imageWithData:data]; NSError *err = nil; [UIImageJPEGRepresentation writeToFile:path options:NSAtomicWrite error:&err]; //3. 添加附件 UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:@"remote-atta1" URL:[NSURL fileURLWithPath:path] options:nil error:&err]; if (attachment) { self.bestAttemptContent.attachments = @[attachment]; } } //4. 返回新的通知内容 self.contentHandler(self.bestAttemptContent); }]; [task resume];}

注意:利用UNNotificationServiceExtension,你有30秒的日子拍卖那些布告,能够协同下载图像和摄像到本地,然后装进为一个UNNotificationAttachment扔给通知,那样就会呈现用服务器获取的图像或然摄像了。这里须求小心:假如数额处理战败,超时,extension会报八个倾家破产音讯,可是文告会用默许的款式显得出来,app不会崩溃。

附属类小零件通知所带的附属类小构件格式大小都以少数的,并不可能做有所职业,录制的前几帧作为三个布告的附属类小构件是个科学的取舍。

<h2 ></h2>

逾期遇见你 余生都以您

2.3 创造触发器

  • 新成效 trigger 能够在特定条件触发,有三类:UN提姆eIntervalNotificationTrigger、UNCalendarNotificationTrigger、UNLocationNotificationTrigger

  • 1、UNTimeIntervalNotificationTrigger:准时推送。

    • 一段时间后触发。

          // timeInterval:单位为秒(s)  repeats:是否循环提醒
      
          // 50s 后提醒
          UNTimeIntervalNotificationTrigger *trigger1 = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:50 
                                                                                                           repeats:NO];
      
  • 2、UNCalendarNotificationTrigger:准时推送。

    • 时光点消息用 NSDateComponents。

          // 在每周一的 14 点 3 分提醒
          NSDateComponents *components = [[NSDateComponents alloc] init];
          components.weekday = 2;
          components.hour = 16;
          components.minute = 3;
      
          // components 日期
          UNCalendarNotificationTrigger *calendarTrigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components 
                                                                                                                    repeats:YES];
      
  • 3、UNLocationNotificationTrigger:定点推送。

    • 地面新闻使用 CLRegion 的子类 CLCircularRegion,能够配备 region 属性 notifyOnEntry 和 notifyOnExit,是在步向地面、从地点出来恐怕两个都要的时候举办通报。

          // 首先得导入 #import <CoreLocation/CoreLocation.h> 。
      
          // 创建位置信息
          CLLocationCoordinate2D center1 = CLLocationCoordinate2DMake(39.788857, 116.5559392);
          CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:center1 radius:500 identifier:@"经海五路"];
          region.notifyOnEntry = YES;
          region.notifyOnExit = YES;
      
          // region 位置信息 repeats 是否重复 (CLRegion 可以是地理位置信息)
          UNLocationNotificationTrigger *locationTrigger = [UNLocationNotificationTrigger triggerWithRegion:region 
                                                                                                    repeats:YES];
      

UNNotificationContentExtension - 布告内容扩张

要想成立二个自定义的客商界面,供给选拔Notification Content Extension。

Notification Content Extension允许开采者插足动和自动定义的分界面,在此个分界面里面,你能够绘制任何你想要的东西。不过有三个最关键的限量就是,这么些自定义的分界面没有相互。它们不可能经受点击事件,顾客并不可能点击它们。不过推送通知大概得以三回九转与客户实行互相,因为客商能够接收notificaiton的actions。精心:extension也得以管理这一个actions

图片 8unnotification-composition.png

  • header的UI是系统提供的一套标准的UI。那套UI会提供给具有的推送文告。
  • header上边包车型客车custom content是自定义的从头到尾的经过,正是Notification Content Extension。在此边,就可以来得此外你想绘制的从头到尾的经过了。你能够显得任何附加的卓有功能的音讯给客商。
  • default content是系统的分界面。那约等于iOS 9 以前的推送的金科玉律。
  • 最下边包车型客车notification action,在此一段,客户能够触发一些操作。并且那么些操作还会相应的显示到地点的自定义的推送分界面content extension中。

创设两个新的Notification Content的target。Xcode自动生成贰个新的模版,下边有三个文件,ViewController、main Interface storyboard、info.plist。

图片 9unnotification-content-extension-files.png

然后张开这里的ViewController。

#import "NotificationViewController.h"#import <UserNotifications/UserNotifications.h>#import <UserNotificationsUI/UserNotificationsUI.h>@interface NotificationViewController () <UNNotificationContentExtension>@property IBOutlet UILabel *label;@end@implementation NotificationViewController- viewDidLoad { [super viewDidLoad]; // Do any required interface initialization here.}- didReceiveNotification:(UNNotification *)notification { self.label.text = notification.request.content.body;}@end

开掘这里的ViewController正是三个日常性的UIViewController, 可是它达成了UNNotificationContentExtension公约。

UNNotificationContentExtension共同商议有叁个required方法didReceiveNotification:。当接过指定categroy的推送时, didReceiveNotification:方法会随着ViewController的生命周期方法,一同被调用,那样就能够负责notification object,更新UI。

接下去正是要让推送到达后,系统如何找到自定义的UI。此时就须求配置extension的info.plist文件。

图片 10unnotification-content-extension-info1.jpeg

这里和我们给notification actions注册category相像,给这么些通知增添内定相应的category。在UNNotificationExtensionCategory字段里写入相应的category id。值得提起的有个别是,这里对应的category是可感觉叁个数组的,里面可认为多少个category,那样做的指标是多少个category共用平等套UI。

图片 11unnotification-content-extension-info2.jpeg

上海体育场所中category id为myNotificationCategory1和myNotificationCategory2的打招呼就共用了一套UI。

设置了category后, 只要在通知里面扩大category字段,值是上边在extension的plist里面配备的category id, 收到的照顾就能通过自定义的体裁展现。

长间距布告在apns里面扩大category字段。

{ "aps":{ "alert":"Testing.. ", "badge":1, "sound":"default", "category":"myNotificationCategory1" }}

下一场开端写自定义UI。

- didReceiveNotification:(UNNotification *)notification { self.label.text = [NSString stringWithFormat:@"%@ [modified]", notification.request.content.title]; self.subLabel.text = [NSString stringWithFormat:@"%@ [modified]", notification.request.content.body]; self.imageView.image = [UIImage imageNamed:@"hong.png"];}

能够在ViewController中追加一些Label和ImageView,收到文告的时候,提取想要的剧情,可能增添额外的原委,设置到大家自定义的View上。

图片 12custom-ui1.png

优化一:开掘是自定义分界面包车型地铁尺寸特别不雅观

  1. 这时候能够透过设置ViewController的preferredContentSize大小,调节自定义视图的分寸。
  2. 也得以经过自律,调控自定义视图的大大小小。
- viewDidLoad { [super viewDidLoad]; self.preferredContentSize = CGSizeMake(CGRectGetWidth(self.view.frame), 100);}

优化二:目的大小的标题一挥而就了,然则开采视图恢复生机成准确的尺寸前,先出示有一大片空白的旗帜,然后改成正确的标准。当公告展现出来未来,它的分寸并非正规的大家想要的尺码。iOS系统会去做一个动漫来Resize它的高低。那样体会比比较糟糕。

图片 13custom-ui2.gif

会产出上边那张图的原因是,在推送送达的那一刻,iOS系统须求明白大家推送分界面包车型地铁最后大小。不过大家自定义的extension在系统筹划体现推送公告的那一刻,并还没曾运转。所以当时,在我们代码都还从未跑起来早前,大家须求报告iOS系统,大家的View最后要显得的朗朗上口。

为了化解那一个难点,大家须要在extension的info.plist里设置贰个content size ratio。增加字段UNNotificationExtensionInitialContentSizeRatio。

图片 14unnotification-content-extension-info3.jpeg

以此特性定义了宽和高的百分比。当然设置了这么些比重以往,也并不是德才统筹的。因为你并不知道你会接纳到多长的content。当你仅仅只设置比例,依然无法完好的来得全数的剧情。某个时候借使大家能够通晓最终的尺寸,那么我们固定尺寸会越来越好。

优化三:这时大家开掘大家自定义的分界面显示的内容(custom content卡塔尔国和系统私下认可的开始和结果(default content卡塔尔(قطر‎重复了。

能够在extension的info.plist里安装,把系统暗中同意的样式隐敝。扩展字段UNNotificationExtensionDefaultContentHidden。

图片 15unnotification-content-extension-info4.jpeg

将系统内容隐敝后效果如下:

图片 16custom-ui3.png

iOS8领头引进的action的专门的学问原理:

暗许系统的Action的拍卖是,当客户点击的按键,就把action传递给app,与此同不常候,推送通告会马上消失。这种做法很有利。

而是有个别情状是,希望客户点击action开关后,效果及时响应在大家自定义的UI上。这时,客户点击完开关,大家把那个action直接传送给extension,并不是传递给app。当actions传递给extension时,它能够延迟推送通告的扼杀时间。在此段延迟的小时之内,大家就足以管理顾客点击开关的事件了,况且更新UI,一切都管理完了今后,我们再去让推送公告消失掉。

那边大家得以行使UNNotificationContentExtension契约的第一个措施,那措施是Optional

- didReceiveNotificationResponse:(UNNotificationResponse *)response completionHandler:(UNNotificationContentExtensionResponseOption option))completion{ if ([response.actionIdentifier isEqualToString:@"action-like"]) { self.label.text = @"点赞成功~"; }else if ([response.actionIdentifier isEqualToString:@"action-collect"]){ self.label.text = @"收藏成功~"; }else if ([response.actionIdentifier isEqualToString:@"action-comment"]){ self.label.text = [(UNTextInputNotificationResponse *)response userText]; } //这里如果点击的action类型为UNNotificationActionOptionForeground, //则即使completion设置成Dismiss的,通知也不能消失 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ completion(UNNotificationContentExtensionResponseOptionDismiss); });}

在此个方法里判别全体的action,更新分界面,并延迟1.5秒后让通报没有。实情恐怕是,点击“赞”开关后,发送乞请给服务器,遵照服务器重返结果,体现分裂的UI效果在通报界面上,然后消失。要是是评价,则将商酌内容更新到界面上。

假使还想把这么些action传递给app,最终死灭的参数应该那样:

completion(UNNotificationContentExtensionResponseOptionDismissAndForwardAction);

而是我其实运维遇见这种场所,假设点击的action类型为UNNotificationActionOptionForeground,则即是completion设置成Dismiss的,通告也不可能清除,也尚无运维app,这里不太理解怎会那样,要是有知情原因的,招待我们商量。

action 有2种类型:

  • UNNotificationAction 普通开关样式
  • UNTextInputNotificationAction 输入框样式

UNTextInputNotificationAction的体裁如下:

图片 17custom-ui4.png

系统的输入样式的action,独有在点击发送按键时,能力担负到action的响应回调。(譬喻上边包车型客车didReceiveNotificationResponse:completionHandler:方法)。但有时系统的样式也许功效无法知足急需,那个时候能够自定义键盘上边的inputAccessoryView。

率先,重写ViewController的上面两个法子:

- canBecomeFirstResponder{ return YES;}- inputAccessoryView{ return self.customInputView;}

自定义inputAccessoryView,以绘制自定义的输入样式。

- didReceiveNotificationResponse:(UNNotificationResponse *)response completionHandler:(UNNotificationContentExtensionResponseOption option))completion{ ... }else if ([response.actionIdentifier isEqualToString:@"action-comment"]){ self.label.text = [(UNTextInputNotificationResponse *)response userText]; [self becomeFirstResponder]; [self.textField becomeFirstResponder]; self.completion = completion; }}

达成了点击商议开关,ViewController 成为第一响应者,使自定义的输入样式彰显出来。然后,让textField成为第一响应者,使键盘弹出。

此地将操作的completion保存,以便在须要的时候调用。例如,能够在点击键盘右下的send按钮时,调用completion,使文告未有。

- textFieldShouldReturn:(UITextField *)textField{ [textField resignFirstResponder]; self.label.text = textField.text; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ self.completion(UNNotificationContentExtensionResponseOptionDismiss); }); return YES;}

落时间效益果与利益入下:

图片 18custom-ui5.png

图片 19不常,暴光笑容,只是不想让你忧虑或优伤。但实则,小编未曾您想象中那么坚强.jpeg

2.4 创设推送的剧情

  • UNNotificationContent:属性 readOnly
  • UNMutableNotificationContent:属性有 title、subtitle、body、badge、sound、lauchImageName、userInfo、attachments、categoryIdentifier、threadIdentifier

    本地消息内容 内容限制大小 展示
    title NSString 限制在一行,多出部分省略号
    subtitle NSString 限制在一行,多出部分省略号
    body NSString 通知栏出现时,限制在两行,多出部分省略号;预览时,全部展示
    • 注意点: body 中 printf 风格的转义字符,比方说要包涵 %,须要写成 %% 才会显得, 同样

          UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
      
          content.title = @"本地推送通知 - title";
          content.subtitle = @"本地推送通知 - subtitle";
          content.body = @"本地推送通知 - body,本地推送通知本地推送通知本地推送通知本地推送通知本地推送通知";
          content.badge = @666;                                                       // 推送消息的角标
          content.sound = [UNNotificationSound defaultSound];                         // 提醒声音
          content.userInfo = @{@"key1":@"userInfoValue1", @"key2":@"userInfoValue2"}; // 收到用户的基本信息
          content.categoryIdentifier = @"Dely_locationCategory";                      // 用于添加 Action 的标识
      

组合使用七个扩充

能够在content extension里面绘制分界面时,通过notification.request.content.attachments获取附属类小零件放到自定义控件里面。

- didReceiveNotification:(UNNotification *)notification { ... UNNotificationAttachment *attachment = notification.request.content.attachments.firstObject; if (attachment) { if ([attachment.URL startAccessingSecurityScopedResource]) { self.imageView.image = [UIImage imageWithContentsOfFile:attachment.URL.path]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [attachment.URL stopAccessingSecurityScopedResource]; }); } }}

咱俩得以提取content的attachments。前文提到过,attachment是由系统管理的,系统会把它们单独的处理,那表示它们存款和储蓄在大家sandbox之外。所以这里咱们要选拔attachment早先,大家需求报告iOS系统,大家需求使用它,并且在行使实现之后告诉系统大家利用达成了。对应上述代码便是-startAccessingSecurityScopedResource和-stopAccessingSecurityScopedResource的操作。当大家获取到了attachment的使用权之后,大家就足以应用十二分文件获取大家想要的音信了。

看完了楼主的一顿矫情一定很同情笔者,不过本身想说地点都以本身胡扯的,技术员怎么或然有女对象,怎么恐怕!下边请跟随楼主脚步一齐装X。

2.5 完整的本土推送创立

  • 申请当地推送

        // 包含头文件
        #ifdef NSFoundationVersionNumber_iOS_9_x_Max
        #import <UserNotifications/UserNotifications.h>
        #endif
    
        // 遵守协议
        <UNUserNotificationCenterDelegate>
    
        - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
            UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    
            // 设置代理,必须写代理,不然无法监听通知的接收与点击事件
            center.delegate = self;
    
            // 判断是否已申请通知权限
            [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
    
                if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined ||
                    settings.authorizationStatus == UNAuthorizationStatusDenied) {
    
                    // 申请通知权限
                    [center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge |
                                                             UNAuthorizationOptionSound |
                                                             UNAuthorizationOptionAlert )
                                          completionHandler:^(BOOL granted, NSError * _Nullable error) {
    
                        if (!error && granted) {
    
                            // 用户点击允许
                            NSLog(@"注册成功");
                        } else {
    
                            // 用户点击不允许
                            NSLog(@"注册失败");
                        }
                    }];
                }
            }];
    
            return YES;
        }
    
  • 收起管理地方推送音信

        // AppDelegate.m
    
        // UNUserNotificationCenterDelegate 协议方法,App 处于前台接收通知
        - (void)userNotificationCenter:(UNUserNotificationCenter *)center 
               willPresentNotification:(UNNotification *)notification 
                 withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
    
            // 收到推送的请求
            UNNotificationRequest *request = notification.request;
    
            // 收到推送的内容
            UNNotificationContent *content = request.content;
    
            // 收到用户的基本信息
            NSDictionary *userInfo = content.userInfo;
    
            // 收到推送消息的角标
            NSNumber *badge = content.badge;
    
            // 收到推送消息 body
            NSString *body = content.body;
    
            // 推送消息的声音
            UNNotificationSound *sound = content.sound;
    
            // 推送消息的副标题
            NSString *subtitle = content.subtitle;
    
            // 推送消息的标题
            NSString *title = content.title;
    
            if ([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
    
                // 收到远程推送消息
                NSLog(@"收到远程推送消息: %@", userInfo);
    
            } else {
    
                // 收到本地推送消息
                NSLog(@"收到本地推送消息: body:%@,title:%@, subtitle:%@, badge:%@,sound:%@, userInfo:%@",
                                              body, title, subtitle, badge, sound, userInfo);
            }
    
            // 需要执行这个方法,选择是否提醒用户,有 Badge、Sound、Alert 三种类型可以设置
            completionHandler(UNNotificationPresentationOptionBadge 
                            | UNNotificationPresentationOptionSound 
                            | UNNotificationPresentationOptionAlert);
        }
    
  • 管理推送音信点击事件

        // AppDelegate.m
    
        // UNUserNotificationCenterDelegate 协议方法
        - (void)userNotificationCenter:(UNUserNotificationCenter *)center 
                didReceiveNotificationResponse:(UNNotificationResponse *)response 
                         withCompletionHandler:(void (^)())completionHandler{
    
            // 收到推送的请求
            UNNotificationRequest *request = response.notification.request;
    
            // 收到推送的内容
            UNNotificationContent *content = request.content;
    
            // 收到用户的基本信息
            NSDictionary *userInfo = content.userInfo;
    
            // 收到推送消息的角标
            NSNumber *badge = content.badge;
    
            // 收到推送消息 body
            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(@"点击远程推送消息: %@", userInfo);
    
            } else {
    
                // 本地推送消息
                NSLog(@"点击本地推送消息: body:%@,title:%@, subtitle:%@, badge:%@,sound:%@, userInfo:%@",
                                             body, title, subtitle, badge, sound, userInfo);
            }
    
            // 系统要求执行这个方法
            completionHandler(); 
        }
    
  • iOS10 创立发送本地通知

        // 添加头文件
        #import <UserNotifications/UserNotifications.h>
    
    • 始建定期推送通告

          - (void)createLocalizedUserNotification1 {
      
              // 设置触发条件
              UNTimeIntervalNotificationTrigger *timeTrigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:10.0f 
                                                                                                                  repeats:NO];
      
              // 创建通知内容
              UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
              content.title = @"定时推送通知 - title";
              content.subtitle = [NSString stringWithFormat:@"定时推送通知 - subtitle,%@", [NSDate date]];
              content.body = @"定时推送通知 - body,定时推送通知定时推送通知定时推送通知定时推送通知定时推送通知";
              content.badge = @666;                                                       // 推送消息的角标
              content.sound = [UNNotificationSound defaultSound];
              content.userInfo = @{@"key1":@"userInfoValue1", @"key2":@"userInfoValue2"}; // 收到用户的基本信息
              content.categoryIdentifier = @"Dely_locationCategory";                      // 用于添加 Action 的标识
      
              // 创建通知标示
              NSString *requestIdentifier = @"Dely.note";
      
              // 创建通知请求
              UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifier
                                                                                    content:content
                                                                                    trigger:timeTrigger];
      
              UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
      
              // 将通知请求添加到用户通知中心
              [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
      
                  if (!error) {
                      NSLog(@"本地推送已添加成功 1 %@", requestIdentifier);
                  }
              }];
          }
      
    • 开创依期推送通知

          - (void)createLocalizedUserNotification2 {
      
              // 创建日期组建
              NSDateComponents *components = [[NSDateComponents alloc] init];
              components.weekday = 4;
              components.hour = 5;
              components.minute = 48;
      
              // 设置触发条件
              UNCalendarNotificationTrigger *calendarTrigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:components 
                                                                                                                        repeats:YES];
      
              // 创建通知内容
              UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
              content.title = @"定期推送通知 - title";
              content.subtitle = [NSString stringWithFormat:@"定期推送通知 - subtitle,%@", [NSDate date]];
              content.body = @"定期推送通知 - body,定期推送通知定期推送通知定期推送通知定期推送通知定期推送通知";
              content.badge = @2;                                                         // 推送消息的角标
              content.sound = [UNNotificationSound defaultSound];
              content.userInfo = @{@"key1":@"userInfoValue1", @"key2":@"userInfoValue2"}; // 收到用户的基本信息
              content.categoryIdentifier = @"Date_locationCategory";                      // 用于添加 Action 的标识
      
              // 创建通知标示
              NSString *requestIdentifier = @"Date.note";
      
              // 创建通知请求
              UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifier 
                                                                                    content:content 
                                                                                    trigger:calendarTrigger];
      
              UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
      
              // 将通知请求添加到用户通知中心
              [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
      
                  if (!error) {
                      NSLog(@"推送已添加成功 2 %@", requestIdentifier);
                  }
              }];
          }
      
    • 创办定点推送通告

          // 添加头文件
          #import <CoreLocation/CoreLocation.h>
      
          - (void)createLocalizedUserNotification3 {
      
              // 创建位置信息
              CLLocationCoordinate2D center1 = CLLocationCoordinate2DMake(39.788857, 116.5559392);
              CLCircularRegion *region = [[CLCircularRegion alloc] initWithCenter:center1 radius:500 identifier:@"经海五路"];
              region.notifyOnEntry = YES;
              region.notifyOnExit = YES;
      
              // 设置触发条件
              UNLocationNotificationTrigger *locationTrigger = [UNLocationNotificationTrigger triggerWithRegion:region 
                                                                                                        repeats:YES];
      
              // 创建通知内容
              UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
              content.title = @"定点推送通知 - title";
              content.subtitle = [NSString stringWithFormat:@"定点推送通知 - subtitle,%@", [NSDate date]];
              content.body = @"定点推送通知 - body,定点推送通知定点推送通知定点推送通知定点推送通知定点推送通知";
              content.badge = @1;                                                         // 推送消息的角标
              content.sound = [UNNotificationSound defaultSound];
              content.userInfo = @{@"key1":@"userInfoValue1", @"key2":@"userInfoValue2"}; // 收到用户的基本信息
              content.categoryIdentifier = @"Address_locationCategory";                   // 用于添加 Action 的标识
      
              // 创建通知标示
              NSString *requestIdentifier = @"Address.note";
      
              // 创建通知请求
              UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:requestIdentifier 
                                                                                    content:content 
                                                                                    trigger:locationTrigger];
      
              UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
      
              // 将通知请求添加到用户通知中心
              [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
      
                  if (!error) {
                      NSLog(@"推送已添加成功 3 %@", requestIdentifier);
                  }
              }];
          }
      
    • 运维结果如下

      图片 20 图片 21

至于调节和测量检验

众多个人在开垦 iOS extension 时境遇了调护治疗的主题素材,能够看这里的解决格局,假若还不可能卓有功能减轻你的难点,应接切磋留言。

图片 22楼主又起来吹牛了.jpg

3、远程推送

  • 远程推送主要流程:

    • 1 应用程序注册音讯推送
    • 2 iOS 跟 APNS Server 要 deviceToken。应用程序选择 deviceToken
    • 3 应用程序将 deviceToken 发送给 Push 服务器端程序
    • 4 Push 服务器端程序向 APNS 发送推送消息
    • 5 APNS 将推送新闻发送给 金立 应用程序

结束语

更多代码实现请查看德姆o, 如开采标题,请扶植指正。

  • iOS10 User Notifications 学习笔记
  • 【WWDC2016 Session】iOS 10 推送Notification新特性

本文由澳门威利斯人发布于威利斯人娱乐,转载请注明出处:通知推送,消息推送

关键词: 通知 IOS 进阶 秘籍 消息