发帖不多,还请见谅
关于 WhatsApp 的离线推送,我们想求助实现方式。
我们的项目是一个 IM 即时通讯 App,客户希望做到像 WhatsApp 一样的, 在 App Kill 掉的情况下,收到离线推送的时候,信息就已经存储到 App 本地。 即使这个时候用户断网,再开启 App,依然能够看到刚才收到的离线消息已经显示在会话中了。
我们之前是使用 VoIP 的方式来做的,使用 VoIP 推送,拉起 App 存储到本地。
但是在 iOS 13 + Xcode 11 的情况下,Apple 要求如果使用了 VoIP 的推送,就一定要 Report CallKit。 我们现在测试的结果是如果是用 Xcode 11 打包的情况下,收到推送如果不 Report,Apple 的推送服务推送几次以后就不会再推了。 除非换成使用 Xcode 10.2 打包,删除重装 App 生成新的 deviceToken 才可以。
但是很快 Xcode 10 打的包 Apple 就不再接受了,我们目前找不到其他能够实现离线推送本地存储的方案。
当然,因为 App 在国外上线,所以不考虑 CallKit 和政策的部分,我们只是想实现离线推送数据在 App 被 Kill 的情况下保存包本地,除了 VoIP 还有没有其他实现方式,客户只是想要离线推送数据缓存而已。
不知道 WhatsApp 用了什么方式,还请各位大佬不吝赐教
1
laravel 2019-12-13 15:51:45 +08:00
离线推送的消息为什么不存在服务器上?用户打开 app,只要通过接口获取就行了
|
3
MikeV2EX 2019-12-13 17:10:21 +08:00
Notification Service Extension 存储数据 + App Group 共享数据 (理论上可行,没实践过
|
4
haozxuan001 2019-12-13 17:18:28 +08:00
之前做过 ios 和安卓的服务端推送,你的需求乍一听很奇怪,就拿这句“ 在 App Kill 掉的情况下,收到离线推送的时候,信息就已经存储到 App 本地”你的 APP 被 KILL 了,唯一能收到推送的是苹果的系统框架,那你觉得在不拉起你的 APP 之前,他会不会帮你保存到你自己的 APP 本地。。。所以核心点你要找出来,不能看样子人家能你就也想。
具体方案:我虽然不知道你 CallKit 是什么,但从你不想 Report 我能推测出来你想打擦边球,那就只能唯一的处理就是推送只管提醒告诉用户(让他打开你的 APP ),第二阶段才是你的 APP 从服务端拉取离线的消息,切记,推送是推送,消息是消息,完全两码事 |
5
ichanne 2019-12-13 17:20:52 +08:00
静默推送,userInfo 中的 aps 中可以设置一个键值对"content-available" : 1,其代表后台推送
|
6
icaics OP @laravel 客户的要求是要在断网的情况下也能看到推送过来的消息,理由是 WhatsApp 可以 ... 我们也解释了 VoIP 的权限控制等等,但是他们要求不用 VoIP,用其他的方式实现 ...
|
7
icaics OP @v5xc 我们测试 WhatsApp 现在还有这种机制,所以推测是用 Xcode 10.2 打包的,年后可能 Apple 就不支持 10 打的包上传 App Store 了,所以收到这种需求,也很纠结 ...
|
8
icaics OP @haozxuan001
1、我确实清楚 App 被 Kill 的情况下无法拉起 App 处理,而我们测试了 WhatsApp,Kill 掉以后,收到离线推送,断网,开 App,可以在没有网络的情况下看到离线消息,说明不是在启动以后联网拉取消息的。 2、针对 1 的情况,我们现在通过 VoIP 已经可以实现了,只不过 Xcode 11 中 Apple 已经不支持这个特性了,确实是为了提升电池寿命,这个我们也能够理解 3、Report CallKit 苹果官方文档就有说,iOS 13 的要求,但是 Xcode 10 打包不支持 Report 所以这个机制可用 4、擦边球这个,我们推测 WhatsApp 现在就是在用这个机制,所以才想来问一问有没有其他人了解这里,我们也希望能够按要求实现 |
9
icaics OP @ichanne 这个我们也尝试过,但是无法拉起 App 做保存信息的动作,我们推测是只能在没 Kill 的情况下处理
不知道有什么注意事项,如果您之前做过 App 被 Kill 下的动作处理,可以给一些提示吗?谢谢 |
10
haozxuan001 2019-12-14 14:40:39 +08:00
@icaics APP kill 后并不是无法通过推送拉起,ios 有两种推送,第一种常见的有消息有提醒的这种无可厚非,第二种就是 5 楼说的,静默推送,官网给出的描述是可以在不前台 APP 的情况下,后台短暂的让 APP 执行一些逻辑,我想这就是你所需要的,至于你回复 5 楼说没办法实现保存这个动作,这个是实现角度,但他的确可以做到。除此之外我想不到任何可能的方案可以在联网前收到推送,断网打开 APP 能看到推送消息这样的逻辑
Ps:我对移动端的断网操作不清楚,是否可能存在你断开的只是用户层的网络,底层的 ios 层面还可以继续请求?(纯推测) |
11
MrStark 2019-12-14 14:59:57 +08:00
Mark,我也想知道还有没有其它解决方法。
|
12
icaics OP @haozxuan001 感谢提供思路和帮助分析 /抱拳
|
13
icaics OP @MrStark 目前看只有通过官方提供的后台操作,我找了 [苹果官方的介绍视频]( https://developer.apple.com/videos/play/wwdc2019/707/),但是也只说了 App 在后台存活的时候怎么做到,如果 App 在后台一段时间,被系统 Kill 以后怎么样,这个视频里就没提了
我推测的是苹果现在只给你后台的操作权限,不给杀掉后在后台拉起的权限,就是为了省电、规范应用 关键是客户现在不认这套了,就是想要我打开 App 就能看到已经收到过的离线消息,不能等着打开 App 以后再拉取 ... |