消息推送开发指南(对即时性和送达率有要求的场景、极光推送设置心跳交互时间)
1、原文:https://kunnan.blog.csdn.net/article/details/103702284 2、本文提供iOS12.1系统以上在后台或者被杀死无法语音播报的解决方案:
通过NotificationServiceExtension实现
3、原理:iOS 10新增了Service Extension,这意味着在APNs到达我们的设备之前,还会经过一层允许用户自主设置的Extension服务进行处理,为APNs增加了多样性。 本文就是利用Service Extension处理消息并语言播报,来解决iOS12.1系统以上在后台或者被杀死无法语音播报的问题
mutable-content : 1
. (以极光平台推送为例,测试的时候,需要在高级设置开启mutable-content) aps = {
alert = {
body = 11;
subtitle = 111;
title = "111223411.34";
};
badge = 1;
"mutable-content" = 1;
sound = default;
};
hasHandled = 1; //标记已经在Extension中被处理,防止重复的语言播报或者打印交易小票等冗余动作。
}
{"aps":{"alert":"This is some fancy message.","badge":6,"sound": "default","content-available":true,"mutable-content":true}}
iOS 10新增了Service Extension,这意味着在APNs到达我们的设备之前,还会经过一层允许用户自主设置的Extension服务进行处理,为APNs增加了多样性。
本文就是利用Service Extension处理消息并语言播报,来解决iOS12.1系统以上在后台或者被杀死无法语音播报的问题
在这里插入图片描述
在这里插入图片描述
注意:
1、Service Extension的Bundle Identifier不能和Main Target(也就是你自己的App Target)的Bundle Identifier相同,否则会报BundeID重复的错误。 2、Service Extension的Bundle Identifier需要在Main Target的命名空间下,比如说Main Target的BundleID为io.re.xxx,那么Service Extension的BundleID应该类似与io.re.xxx.yyy这样的格式。
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler
Service Extension服务已经创建成功之后,你的项目中包含两个方法。
1、didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent *contentToDeliver))contentHandler
APNs到来的时候会调用这个方法,此时你可以对推送过来的内容进行处理,然后使用contentHandler完成这次处理。但是如果时间太长了,APNs就会原样显示出来。 也就是说,我们可以在这个方法中处理我们的通知,个性化展示给用户。
2、serviceExtensionTimeWillExpire
而serviceExtensionTimeWillExpire方法,会在过期之前进行回调,此时你可以对你的APNs消息进行一下紧急处理。