iOS图片推送的一些开发小Tips

栏目: IOS · 发布时间: 7年前

内容简介:推送

iOS图片推送的一些开发小Tips

推送

iOS图片推送的一些开发小Tips

推送详情

新版本产品大大要求增加图文推送的功能。

由于项目中已经集成了推送功能,故本篇只讲一下接入图片推送的相关Tips。

新建NotificationService、NotificationContent的流程

iOS图片推送的一些开发小Tips

新建Target

iOS图片推送的一些开发小Tips

iOS图片推送的一些开发小Tips

bundle id

NotificationService的作用

下载图片/音频/视频文件(注意:下载时间只有30秒、超时通过serviceExtensionTimeWillExpire方法进行迅速处理)。

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];
    NSString *subTitle = [[request.content.userInfo valueForKey:@"推送中自定义的字典字段"] valueForKey:@"自定义副标题字段"];
    NSString *attchUrl = [[request.content.userInfo valueForKey:@"推送中自定义的字典字段"] valueForKey:@"自定义图片字段"];
    self.bestAttemptContent.subtitle = subTitle.length > 0 ? subTitle : @"";
    //1. 下载
    NSURL *url = [NSURL URLWithString:attchUrl];
    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 (!error) {
            //2. 保存数据, 不可以存储到不存在的路径
            NSString *path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES).firstObject stringByAppendingPathComponent:@"logo.png"];
            UIImage *image = [UIImage imageWithData:data];
            [UIImageJPEGRepresentation(image, 1) 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];
            }
        }
        self.contentHandler(self.bestAttemptContent);
    }];
    [task resume];
}

下载超时,则通过下面的方法,改成展示原有系统样式。

- (void)serviceExtensionTimeWillExpire 
{
    self.contentHandler(self.bestAttemptContent);
}

如何使推送走NotificationService的处理?

服务端设置"mutable-content":1 ,这样推送过来就会走NotificationService的处理逻辑。

{
  "aps":{
    "alert":{
      "title":"iOS 10 title",
      "subtitle":"iOS 10 subtitle",
      "body":"iOS 10 body"
    },
    "my-attachment":"http://img01.taopic.com/160317/240440-16031FU23937.jpg",
    "mutable-content":1,
    "category":"myNotificationCategory1",
    "sound":"default",
    "badge":3
  }
}

所有的操作都对了,为什么还是不能走NotificationService的断点?

  1. 首先说一下UNNotificationContentExtension的调试:直接切换target,点击run即可。

  2. 而UNNotificationServiceExtension,因为该代码完全处于后台执行(不像UNNotificationContentExtension可以由通知界面打开触发),像上面那种方式调试还是不会走断点,这就需要Debug -> Attach to process by pID or name:

iOS图片推送的一些开发小Tips

iOS图片推送的一些开发小Tips

NotificationContent作用

UNNotificationContentExtension用于自定义3D Touch后弹出的视图,并且可以用UNNotificationAction自定义按钮。

NotificationContent注意点

1、若想使用NotificationContent自定义3D Touch后弹出的视图,必须让服务端设置"category":"your categoryId"参数,这个参数在UNNotificationContentExtension的info.plist中设置,只有服务端配置的category和你本地设置的一样,才会走你自定义的NotificationContent。并且category可以设置多个,即可以有多套自定义3D Touch UI。

iOS图片推送的一些开发小Tips

2、如果普通推送,则"mutable-content","category"两个参数都不要设置或为空。

3、NotificationService、NotificationContent都需要设置一下AllowArbitraryLoads为YES。

iOS图片推送的一些开发小Tips

参考(偷了个懒,部分图片引用自下方文章,感谢~):

作者:dj_rose

链接:https://www.jianshu.com/p/0ab721604877


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

机器学习

机器学习

周志华 / 清华大学出版社 / 2016-1-1 / 88.00元

机器学习是计算机科学与人工智能的重要分支领域. 本书作为该领域的入门教材,在内容上尽可能涵盖机器学习基础知识的各方面。 为了使尽可能多的读者通过本书对机器学习有所了解, 作者试图尽可能少地使用数学知识. 然而, 少量的概率、统计、代数、优化、逻辑知识似乎不可避免. 因此, 本书更适合大学三年级以上的理工科本科生和研究生, 以及具有类似背景的对机器学 习感兴趣的人士. 为方便读者, 本书附录给出了一......一起来看看 《机器学习》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具