如何实现IOS APP被杀掉后依然可以接收到个推消息通知

背景

项目已经集成了个推SDK,但是在离线场景下无法收到推送消息,离线场景主要分2种情况,一种是用户将APP切换到了后台,一种是用户将APP杀掉了。
针对场景一:我们可以将APP支持后台运行,比如项目中使用到了后台持续定位功能,后台音频等(Xcode中可以查看支持哪些后台模式),可以增加接收到离线通知的概率。

后台模式
针对场景二:我们需要集成NotificationServiceExtension,下面就主要介绍一下如何集成

新增NotificationServiceExtension

在XCode中,按照以下步骤操作

新增一个target

新增Target
选择Notification Service Extension

配置好NotificationService的包名和签名

Bundle一般就用自己APP的包名加上NotificationService,如 com.edenwang.www.NotificationService

将下载的个推SDK中的NotificationService代码复制到项目中

个推SDK下载地址

https://docs.getui.com/download.html

下载个推SDK

解压开找到NotificationService

解压后的代码结构

将压缩包中NotificationService.swift文件内容替换项目中的NotificationService.swift

Info.plist和NotificationService.entitlements

在这里插入图片描述
记得将NotificationService.entitlements中包名更新成自己的

新建一个空的OC文件

Empty.m是新建的一个空的Objective-C文件,这个文件不能少。这个是咨询个推的技术人员后才得知的,说是混编的问题,如果是Swift项目需要加一个OC文件,如果是OC项目需要加一个空的Swift文件。可以查看下载的个推SDK中其他方式的实现作对比。

其他文件复制

复制NotificationService-Bridging-Header.h

打包测试

为了快速测试,需要将个推的后台运行临时关掉 GeTuiSdk.runBackgroundEnable(false)
安装到手机上后,将APP退出到后台后,稍等片刻,在个推控制台上查询当前设备的CID,检查CID的状态是否为离线,如果已经为离线了,可以通过个推的控制台推送测试消息,然后观察手机上收到的消息是否包含[Success]字符,如果有,说明大功告成了。

  override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {self.contentHandler = contentHandlerguard let bestAttemptContent = request.content.mutableCopy() as? UNMutableNotificationContent else { return }// [ 测试代码 ] TODO:语音播报let cnt: Double = 123 //读取apns中播报信息let name = ApnsHelper.makeMp3FromExt(cnt)let sound = UNNotificationSound(named: UNNotificationSoundName(name))bestAttemptContent.sound = sound// [ 测试代码 ] TODO: 用户可以在这里处理通知样式的修改,eg:修改标题,开发阶段可以用于判断是否运行通知扩展
//    bestAttemptContent.title = "\(bestAttemptContent.title) [WillIn]"// [ GTSDK ] 统计APNs到达情况和多媒体推送支持接口, 建议使用该接口GeTuiExtSdk.handelNotificationServiceRequest(request, withAttachmentsComplete: { [weak self] (attachments: Array?, errors: Array?) inguard let handler = self?.contentHandler else { return }// [ 测试代码 ] TODO:日志打印,如果APNs处理有错误,可以在这里查看相关错误详情// print("处理个推APNs展示遇到错误:\(String(describing: errors))")// [ 测试代码 ] TODO:用户可以在这里处理通知样式的修改,eg:修改标题,开发阶段可以用于判断是否运行通知扩展bestAttemptContent.title = "\(bestAttemptContent.title) [Success]"if let attachment = attachments as? [UNNotificationAttachment], !attachment.isEmpty {// 设置通知中的多媒体附件bestAttemptContent.attachments = attachment}// 展示推送的回调处理需要放到个推回执完成的回调中handler(bestAttemptContent)})}

然后你可以在这个代码基础上定制自己的业务逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF实现右键选定TreeViewItem

在WPF中,TreeView默认情况是不支持右键选定的,也就是说,当右键点击某节点时,是无法选中该节点的。当我们想在TreeViewItem中实现右键菜单时,往往希望在弹出菜单的同时选中该节点,以使得菜单针对选中的节点生…

【Py/Java/C++三种语言详解】LeetCode每日一题240112【哈希表】LeetCode2085、统计出现过一次的公共字符串

文章目录 题目描述解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述 给你两个字符串数组 words1 和 words2 ,请你返回在两个字符串数组中 都恰好出现一次 的字符串的数目。 示例 1: 输入:words1 […

GBASE南大通用提问:如果程序检索到 NULL 值,该怎么办?

可在数据库中存储 NULL 值,但编程语言支持的数据类型不识别 NULL 状态。程序必须 采用某种方式来识别 NULL 项,以免将它作为数据来处理。 在 SQL API 中,指示符变量满足此需要。指示符变量是与可能收到 NULL 项的主变量相 关联的一个附加的变…

协作共生:数字孪生与智慧城市的共赢之路

引言 随着科技的飞速发展,数字孪生和智慧城市的概念逐渐融入现代城市的规划和建设中。数字孪生技术为智慧城市的建设提供了强大的支持,而智慧城市则为数字孪生的应用提供了广阔的舞台。本文将深入探讨数字孪生与智慧城市之间的相互影响与协作&#xff0…

建筑产业元宇宙:探索未来建筑的无限可能

随着科技的飞速发展,人类对于未来的想象愈发丰富。在这个充满无限可能的时代,建筑产业也迎来了新的突破。建筑产业元宇宙作为一种全新的概念,正逐渐成为现实。那么,什么是建筑产业元宇宙?它将如何改变我们的生活&#…

Linux命令实战:解决日常问题的利器

目录 前言: 1、文件管理 2、文档编辑 3、文件传输 4、磁盘管理 5、磁盘维护 6、网络通讯 7、系统管理 8、系统设置 9、备份压缩 10、设备管理 前言: 随着信息技术的飞速发展,Linux系统已成为许多领域的核心工具。无论是服务器管理…

系列七、Spring Security中基于Jdbc的用户认证 授权

一、Spring Security中基于Jdbc的用户认证 & 授权 1.1、概述 前面的系列文章介绍了基于内存定义用户的方式,其实Spring Security中还提供了基于Jdbc的用户认证 & 授权,再说基于Jdbc的用户认证 & 授权之前,不得不说一下Spring Se…

探索“城堡世界”APP:你的城堡,你的冒险

在繁忙的生活中,我们常常渴望有一个属于自己的世界,可以随心所欲地探索和冒险。今天,我们要为大家介绍的是一款名为“城堡世界”的APP,它将带给你实现这个梦想的机会。 “城堡世界”是一款独特的APP,它允许用户通过购买…

【局域网window10系统搭建共享文件夹或与手机共享】

局域网window10系统搭建共享文件夹或与手机共享 1、Window 10之间搭建共享文件夹1.1 ping通两台window 10 电脑1.2 创建共享账号(window 10专业版)1.3 创建共享文件夹以及配置1.4访问共享文件夹 2、手机访问window10 共享文件夹(结合步骤一&a…

Linux内存管理:(八)页面迁移

文章说明: Linux内核版本:5.0 架构:ARM64 参考资料及图片来源:《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址: zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 可迁移页面 页面迁移机制支持两…

基于集成学习算法XGBoost农作物产量可视化分析预测系统

文章目录 基于集成学习算法XGBoost农作物产量可视化分析预测系统一、项目简介二、开发环境三、项目技术四、功能结构五、功能实现模型构建封装类用于网格调参训练模型系统可视化数据请求接口模型评分 0.5*mse 六、系统实现七、总结 基于集成学习算法XGBoost农作物产量可视化分析…

Netty通信中的粘包半包问题(一)

前言 我们在日常开发过程中,客户端和服务端的连接大多使用的是TCP协议,因为我们要保证数据的可靠传输, 当网络中出现丢包时要求,要求数据包的发送端重传给接收端。而TCP是一种面向连接的传输层协议, 当使用TCP进行传输时&#xf…

vue前端开发自学,插槽练习第二次,name属性的使用

vue前端开发自学,插槽练习第二次,name属性的使用!可以使用name属性,来自定义一个名字,这样,就可以在一个组件内同时出现多个插槽的内容了。在子组件内接收的时候,很简答,只需要在slot标签里面加上name“mz”&#xff1…

业务向——基于多多进宝平台的CPS

业务向——基于多多进宝平台的CPS 导读小试牛刀商品活动推广商品详情获取频道推广订单获取及和用户绑定小结 导读 多多进宝是拼多多的开放平台,为广大商家和推广者提供了一个机会,通过推广拼多多的商品来实现收益。多多进宝的CPS(按效果付费…

[JAVA数据结构] 认识 Iterable、Collection、List 的常见方法签名以及含义

目录 (一)Iterable 1. 介绍 2. 常见方法 (二)Collection 1. 介绍 2. 常见方法 (三) List 1. 介绍 2. 常见方法 总结 (一) Iterable 1. 介绍 Iterable接口是Java中的一个接口,它是集合框架中的根接口之一。Iterable接口表示实现了迭代功能,即可以通过迭…

鸿蒙HarmonyOS兼容JS的类Web开发

鸿蒙HarmonyOS兼容JS的类Web开发 文章目录 鸿蒙HarmonyOS兼容JS的类Web开发文件组织目录结构文件访问规则媒体文件格式 js标签配置pageswindow示例 app.js应用生命周期应用对象6 HML语法参考页面结构数据绑定普通事件绑定冒泡事件绑定5捕获事件绑定5列表渲染条件渲染逻辑控制块…

HTML5 画布绘制海报

需求: 1、根据用户填写的联系人信息:姓名、手机号及微信二维码,生成海报,并下载保存到本地; 2、可多个海报切换供用户选择 实现:使用html5实现,为方便用户,做的手机网站的样式&am…

图形化编程:下一代的创新教育工具

在科技日新月异的今天,编程已经成为了一项必备的技能。然而,传统的编程语言对于许多人来说仍然是一项挑战,尤其是对于年轻的学习者。为了解决这个问题,图形化编程应运而生,它以其直观、易理解和易操作的特点&#xff0…

【2023开发组二等奖】地震数据管理及评估系统

作品介绍 1 作品背景与需求分析 1.1 项目背景 随着全球气候的变化和人类活动的不断扩大,各种自然灾害的发生频率和严重程度都在不断增加。其中,地震作为一种常见的自然灾害,给人们的生命和财产带来了极大的威胁。 “十四五”国家防震减灾规划通知提出:“防震减灾是防灾减…

【MySQL】本地创建MySQL数据库详解

文章目录 下载MySQL安装重置密码本地连接 下载MySQL 下载网址:https://dev.mysql.com/downloads/mysql/ 安装 将下载好的压缩包解压到D盘。 在解压好的文件夹中创建my.ini文件。 将以下代码复制粘贴到创建好的my.ini文件中。注意修改文件路径。 [mysqld] #设置…