iOS 10 新特性之通知推送--干货一篇

作者: JoyceZoe | 来源:发表于2016-09-23 19:10 被阅读4291次

        iOS10 新特性一出,各家纷纷出动研究新特性能给场景智能化所带来的好处,从widget到推送通知的拓展。不意外的,当我还没有来得及跟公司沟通新特性在软件上的应用时,就被公司拉来研究了,今天我先就iOS 10 在推送通知上的新增API以及使用方法说一说:

    (不避讳的说,程序媛一枚,欢迎点赞)

    iOS10 的推送通知支持图片啦!!支持视频了!!支持自定义样式了!!

    首先认识一个类:UNNotificationSettings (枚举,通知支持的样式:声音,弹框,横幅,等等)

    第一步注册通知:

    当然我们要引入头文件:

    <UserNotifications/UserNotifications.h>

    //注册推送通知,iOS10之后不论是否本地通知与远程推送通知,都将采用注册,以及请求发送的形式

    UNUserNotificationCenter *notificationCenter = [UNUserNotificationCenter currentNotificationCenter];

    notificationCenter.delegate = self;

    [notificationCenter requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^(BOOL granted, NSError * _Nullable error) {

    NSLog(@"%d--%@", granted, error);

    }];; //option参数设置支持通知的样式,声音,横幅,弹框,等


    磨刀不误砍材工,再来认识几个类:

    trigger

    设置通知的触发时机:

    UNCalenderNotificaitionTrigger(设置某时固定触发通知)

    UNLocationNotificaitionTrigger (设置当进入某一区域触发通知)

    UNTimeIntervalNotificaitionTrigger (设置多久后触发通知)

    content

    UNNoticificationContent (一个设置通知组件的类,title,message,categoryIdentifier,媒体图片,视频,等都装在这个结构体中发出通知请求,它还有一个和它一对的类UNMutableNoticificationContent)

    UNNotificationAction (添加交互事件,包括输入文字,点击按钮)

    UNNotificationAttachment (媒体相关,想要推送带“图片”和”视频“的通知,但是只支持本地的图片和视频,想要获取数据只能下载到本地再推送哦。

    PS:我踩过一个坑,你以为要自己清除下载到本地的缓存?想多啦,即使是存储在Document,发送完通知之后苹果会找到这条路径自动清空缓存,做demo的时候发现自己存在那个路径的图片都在发送通知后的一瞬间被清空了,也就是说,想再利用这张图,要再下载哦,或者把这张图本地持久化,我是把图转成data存在NSUserDefaults了,个人觉得有点麻烦,有更好方法的大神给我留言哦~~!!)

    第二步:初始化通知组件

    //1.初始化通知

    UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];

    content.badge = @1;

    content.title = self.titleTF.text;

    content.body = self.messageTextView.text;  //如果没有body则不会弹出通知

    UNNotificationSound *sound = [UNNotificationSound defaultSound];

    content.sound = sound;//通知声音

    content.categoryIdentifier = @"uid";//不要急,后面有解释

    UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:5 repeats:NO];//5秒后推送

    NSString *localPath = [self getPathWithPhoteData:[[NSUserDefaults standardUserDefaults]objectForKey:@"photo"]];

    if (localPath && ![localPath isEqualToString:@""]) {

    UNNotificationAttachment * attachment = [UNNotificationAttachment attachmentWithIdentifier:@"photo" URL:[NSURL URLWithString:[@"file://" stringByAppendingString:localPath]] options:nil error:nil];

    if (attachment) {

    content.attachments = @[attachment];

    }

    //localPath是我通过拿到相册图片存到本地的路径(为什么不用url直接下载图片拼接本地路径呢,因为产品想要用,他们想自己从相册选照片!!!),总之把一个本地图片的url丢到attachment里面就可以发送一个有图片的通知了,视频也是一样用法呢。


    第三部:伟大的推送请求~

    UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"push" content:content trigger:trigger];

    //参数就是触发时机和通知组建

    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];

    [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {

    if (error) {

    NSLog(@"%@", error);

    }

    }];


    这是我的demo是一个可以自己输入内容发送通知,并且可以设置点击通知跳转到某网页的操作。

    demo主页面(可以自己填写通知内容) 填好了 前台也可接到通知

    第四部:处理通知

    用到这个代理:UNUserNotificationCenterDelegate

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

    处理用户与通知交互后的操作,我demo中的点击跳转网页就是在这里处理

    }

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

    // 允许在前台展示消息,不设置的话,默认是不行的

    completionHandler(UNNotificationPresentationOptionAlert|UNNotificationPresentationOptionSound);}


    下拉展示图片 点击跳转百度

    接下来具体说说苹果关于通知的拓展框架:

    前者负责自定义UI,后者负责交互处理在用户收到通知之前给一定的时间给我们处理事务

    这部分写的人比较多,我来补个漏

    有的人自定义的UI之后发现根本不显示,实际上要注意在info.里面的配置:

    在NotificationContent里面的info.中,有3个key注意设置

    1.ExtensionCategory负责绑定到通知中去,记得上面的content.categoryIdentifier = @"uid";

    这里的ExtensionCategory要和content中设置的分类ID一致才能用过这个拓展框架显示自定义的UI

    2.UNNotificationExtensionDefaultContentHidden 这个key是boolean类型,之前我设置好自定义UI之后发现,出现了两个title,两个message,是因为我们没有隐藏苹果官方格式的通知,隐藏掉就好了,这里要设置为YES

    今天就写到这里啦~~谢谢大家。

    相关文章

      网友评论

      • 狗狗臭鸡蛋:demo地址给一下的
      • 小包包包:楼主,想问下,如果是远程的,要推送图片,客户端必须使用扩展,如果是本地的,可以不用扩展,不知道我这么理解对不对?
        小包包包:@Eric_dd3b 是的,如果要带图片,必须要用到扩展
        Eric_dd3b:我也是你这样理解的,不知道到底对不对呢?现在要做远程的推送图片。必须用扩展吗?
      • 4119da77c1fe:哇,大神求带啊,666
      • Mr_某某某:我需要一个demo
      • 44832370a1f6:demo呢?
      • wahewe:demo
      • 蘅芜萧何:作为代码的搬运工,求demo, :smile:
      • RITL:您好,我想看一下你的getPathWithPhoteData方法,我将图片写入沙盒,拿出路径初始化UNNotificationAttachment对象时总出错..
        RITL:@JoyceZoe 没事,写的很好,3Q
        JoyceZoe:@RITL 才看到你的留言~ :relaxed:
        RITL:@RITL 已找到原因,如果是图片,存到本地,不能忘记加图片后缀 :smiley: :blush:
      • 95c9800fdf47:来个demo
        69662402cbe0:@JoyceZoe 亲能来个链接吗谢了
        95c9800fdf47:@JoyceZoe 嗯,来个demo我直接看代码!多谢!
        JoyceZoe:@博爱1616 是要这篇里面的完整demo是嘛?我把它弄到github上去,然后把链接发给你~
      • 已重置2020:获取文件路径,可以使用这个方法:NSString *filePath = [[NSBundle mainBundle] pathForResource:@"photo.jpg" ofType:nil];
      • 一鸣:修正之后回复一下本消息,可收进首页
        JoyceZoe:@一鸣 谢谢您,但是我修改成markDown格式后提示我只有在新文档才能更改成代码框,不能再我现有基础上修改了。
      • 一鸣:代码要用代码框来实现哇,要不然格式不规范不能上首页的~
      • luozhiwei:我就不点赞!就不!尽管写的不错
      • Pusswzy:而且一定要投稿哦
        JoyceZoe:@Pusswzy 投完了谢谢

      本文标题:iOS 10 新特性之通知推送--干货一篇

      本文链接:https://www.haomeiwen.com/subject/kibcsttx.html