怎样实现IOS APP被杀掉后依然可以接收到个推消息关照

打印 上一主题 下一主题

主题 465|帖子 465|积分 1395

配景

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

针对场景二:我们需要集成NotificationServiceExtension,下面就主要介绍一下怎样集成
新增NotificationServiceExtension

在XCode中,按照以下步骤操作
新增一个target



配置好NotificationService的包名和签名

Bundle一样平常就用自己APP的包名加上NotificationService,如 com.edenwang.www.NotificationService
将下载的个推SDK中的NotificationService代码复制到项目中

个推SDK下载地址

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

解压开找到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]字符,如果有,说明大功告成了。
  1.   override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
  2.     self.contentHandler = contentHandler
  3.     guard let bestAttemptContent = request.content.mutableCopy() as? UNMutableNotificationContent else { return }
  4.    
  5.     // [ 测试代码 ] TODO:语音播报
  6.     let cnt: Double = 123 //读取apns中播报信息
  7.     let name = ApnsHelper.makeMp3FromExt(cnt)
  8.     let sound = UNNotificationSound(named: UNNotificationSoundName(name))
  9.     bestAttemptContent.sound = sound
  10.    
  11.     // [ 测试代码 ] TODO: 用户可以在这里处理通知样式的修改,eg:修改标题,开发阶段可以用于判断是否运行通知扩展
  12. //    bestAttemptContent.title = "\(bestAttemptContent.title) [WillIn]"
  13.    
  14.     // [ GTSDK ] 统计APNs到达情况和多媒体推送支持接口, 建议使用该接口
  15.     GeTuiExtSdk.handelNotificationServiceRequest(request, withAttachmentsComplete: { [weak self] (attachments: Array?, errors: Array?) in
  16.       guard let handler = self?.contentHandler else { return }
  17.       // [ 测试代码 ] TODO:日志打印,如果APNs处理有错误,可以在这里查看相关错误详情
  18.       // print("处理个推APNs展示遇到错误:\(String(describing: errors))")
  19.       
  20.       // [ 测试代码 ] TODO:用户可以在这里处理通知样式的修改,eg:修改标题,开发阶段可以用于判断是否运行通知扩展
  21.       bestAttemptContent.title = "\(bestAttemptContent.title) [Success]"
  22.       if let attachment = attachments as? [UNNotificationAttachment], !attachment.isEmpty {
  23.         // 设置通知中的多媒体附件
  24.         bestAttemptContent.attachments = attachment
  25.       }
  26.       // 展示推送的回调处理需要放到个推回执完成的回调中
  27.       handler(bestAttemptContent)
  28.     })
  29.   }
复制代码
然后你可以在这个代码底子上定制自己的业务逻辑。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表