iOS10自定义推送UI和推送内容(上)

前言

iOS10这个系统已经出来一年多了,那时候系统刚发布的时候也做过iOS10推送的适配,但是那时候推送是集成第三方的,所以对新的系统的推送的升级不是很了解,UserNotifications.frameworks和UserNotificationUI.frameworks是在iOS10上发布的,可以认为是通知大改版,用于在新系统上替换久的通知框架,苹果给了我们一个能够自定义推送的一个机会,但是因为那是时候的工作没有涉及到这一块,只是对iOS10上的新通知框架有个初步的了解,并没有深入学习这两个新的推送框架,因为最近产品上有这样的需求,需要自定义推送的UI和统计推送的送达率等,所以对这两个框架进行了深入的学习,并且写篇文章总结一下,本篇文章最要是围绕着Notification Service Extension和Notification Content Extension来展开,有关iOS10系统的通知特性请看文章下面推荐的文章。

知识准备

在深入学习之前,如果大家没有看过iOS10推送相关的内容,这里推荐一篇文章供大家学习和了解一下iOS10推送相关的一些知识,本篇文章涉及的内容跟下面的文章会有所关联,当然会深入一些,学习嘛~需要循序渐进

自定义推送内容

在iOS 10以上版本的系统,苹果推送了Notification Service Extension(通知内容扩展)给我们自定义推送的内容

1、Notification Service Extension简介

Notification Service Extension是在iOS10推出后的一个新的通知特性,原理如下图(图片来源网络):

从图片我们可以看出,当手机接收到APNs推送给用户的消息后,中间添加了Service Extension这一个处理的步骤(当然也可以啥都不处理),通过这个扩展我们可以把我们要自定义的内容的处理放在这个步骤里面做,然后再呈现给用户,使得推送的内容更加丰富化,当然这里是有时间限制的(后面会详细讲)

2、Notification Service Extension能做些什么事情

  • 统计推送送达率
  • 自定义内容,推送内容丰富化
  • 安全,可以防止推送内容被拦截和篡改

3、Notification Service Extension构建和使用

如果有使用过Extension的同学都知道,其实Extension在工程里面就是一个target,那么Noification Service Extension也不例外也是一个target:

接着选择Notification Service Extension,如下图:

完成后就会在主工程上看到对应的Notification Service Extension的target:

在Notification Service Extension里面会看到有两个函数:

通知的内容自定义在这个函数处理,可以处理附件的下载、推送内容修改、推送送达率的统计等:

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void)

这个函数是当你接收到一条远程通知后,系统会调用override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void)这个函数给你处理通知的内容,当然系统也不会给很长的时间,长时间等待会造成体验不好什么的,系统只给你30秒的时间处理,如果处理不完会调用override func serviceExtensionTimeWillExpire()这个函数,如果你还不做出相应的操作,那么将显示最开始的通知的内容。

override func serviceExtensionTimeWillExpire()

例如推送统计送达率,推送送达率其实就是手机接收到通知后,系统调起了Notification Service Extension,那么这时候在接收到通知的回调里面,发送一个请求告诉服务端手机客户端已经接收到这条通知,以达到推送送达率统计的目的:

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
        
        //TODO 推送统计通达率
        let url: URL = URL.init(string: "your https address")!
        let urlRequest: URLRequest = URLRequest.init(url: url)
        let urlSession: URLSession = URLSession.init(configuration: URLSessionConfiguration.default)
        let task: URLSessionDataTask = urlSession.dataTask(with: urlRequest) { (data, res, error) in
            
            //统计完了回调通知
            if let bestAttemptContent = self.bestAttemptContent {
                bestAttemptContent.title = "\(bestAttemptContent.title) [modified]"
                contentHandler(bestAttemptContent)
            }
        }
        
        task.resume()
    }

例如内容自定义:

override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
        
        //TODO: 修改推送的标题和内容等
        if let bestAttemptContent = self.bestAttemptContent {
            bestAttemptContent.title = "这是我自定义推送的标题!!!🐶🐶"
            bestAttemptContent.body = "这是我自定义推送的内容!!!🍎🍐"
            contentHandler(bestAttemptContent)
        }
    }

4、Notification Service Extension配置

前面说到Extension是一个target,那么就会涉及到打包相关的工作,这里需要配置对应的bundle identifier和打包的描述文件:

推送环境的配置和勾选,需要开启push Notifications配置:

NotificationServiceExtension_7.png

假如你需要在网络上下载一些资源或者是一些数据请求,那么需要配置info.plist文件允许网络访问权限(如果不配置会导致程序奔溃):

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

关于调试

对于Notification Service Extension的调试,我在开发的过程中遇到了不少的问题,也花了不少的时间去查资料等,国内这一块的资料比较少而且也不全面,所以这里补充一下我遇到的问题和才到的坑

  • 程序编译了,当接收到通知的时候代码没有起作用,其实是调试的方式不对,首先是要调试主工程,然后再调试Notifcation Service Extension,再回到主工程调试Notification Service Extension的代码就会执行,你修改的内容就会在通知上看到

  • 关于debug断点,是要在主工程的调试的时候去监听Notification Service Extension 才能断点,不能直接在Notification Service Extension调试的时候去断点调试,如果在这里调试可以在macOS的控制台App中看到Notification Service Extension启动后被系统kill了

  • 关于前面连个步骤都不能起效果,是因为你的APNs推送的数据个数不对,需要加上mutable-content字段

{
    "aps": {
        "alert": {
            "title": "推送测试",
            "body": "推送内容",
            "type": 20
        },
        "badge": 6,
        "sound": "default",
        "mutable-content": 1,
        "category": "customUI"
    }
}

推送调试工具

这里安利大家两个能够不需要服务器配置也能够测试的小工具

  • SmartPush
  • Easy APNs Provider,App Store可以下载
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容