V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
icaics
V2EX  ›  iDev

关于 WhatsApp 的离线推送保存到本地

  •  
  •   icaics · 2019-12-13 14:20:23 +08:00 · 13725 次点击
    这是一个创建于 1568 天前的主题,其中的信息可能已经有所发展或是发生改变。

    发帖不多,还请见谅

    关于 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 条附言  ·  2019-12-14 16:45:03 +08:00
    官方讲解 Advances in App Background Execution
    https://developer.apple.com/videos/play/wwdc2019/707/

    但是没有提到 App 在后台被系统 Kill 以后怎么办
    15 条回复    2019-12-20 11:05:41 +08:00
    laravel
        1
    laravel  
       2019-12-13 15:51:45 +08:00
    离线推送的消息为什么不存在服务器上?用户打开 app,只要通过接口获取就行了
    v5xc
        2
    v5xc  
       2019-12-13 16:13:05 +08:00
    @laravel whatsapp 不是被 ban 了
    MikeV2EX
        3
    MikeV2EX  
       2019-12-13 17:10:21 +08:00
    Notification Service Extension 存储数据 + App Group 共享数据 (理论上可行,没实践过
    haozxuan001
        4
    haozxuan001  
       2019-12-13 17:18:28 +08:00
    之前做过 ios 和安卓的服务端推送,你的需求乍一听很奇怪,就拿这句“ 在 App Kill 掉的情况下,收到离线推送的时候,信息就已经存储到 App 本地”你的 APP 被 KILL 了,唯一能收到推送的是苹果的系统框架,那你觉得在不拉起你的 APP 之前,他会不会帮你保存到你自己的 APP 本地。。。所以核心点你要找出来,不能看样子人家能你就也想。

    具体方案:我虽然不知道你 CallKit 是什么,但从你不想 Report 我能推测出来你想打擦边球,那就只能唯一的处理就是推送只管提醒告诉用户(让他打开你的 APP ),第二阶段才是你的 APP 从服务端拉取离线的消息,切记,推送是推送,消息是消息,完全两码事
    ichanne
        5
    ichanne  
       2019-12-13 17:20:52 +08:00
    静默推送,userInfo 中的 aps 中可以设置一个键值对"content-available" : 1,其代表后台推送
    icaics
        6
    icaics  
    OP
       2019-12-13 18:03:38 +08:00
    @laravel 客户的要求是要在断网的情况下也能看到推送过来的消息,理由是 WhatsApp 可以 ... 我们也解释了 VoIP 的权限控制等等,但是他们要求不用 VoIP,用其他的方式实现 ...
    icaics
        7
    icaics  
    OP
       2019-12-13 18:04:45 +08:00
    @v5xc 我们测试 WhatsApp 现在还有这种机制,所以推测是用 Xcode 10.2 打包的,年后可能 Apple 就不支持 10 打的包上传 App Store 了,所以收到这种需求,也很纠结 ...
    icaics
        8
    icaics  
    OP
       2019-12-13 18:13:11 +08:00
    @haozxuan001

    1、我确实清楚 App 被 Kill 的情况下无法拉起 App 处理,而我们测试了 WhatsApp,Kill 掉以后,收到离线推送,断网,开 App,可以在没有网络的情况下看到离线消息,说明不是在启动以后联网拉取消息的。

    2、针对 1 的情况,我们现在通过 VoIP 已经可以实现了,只不过 Xcode 11 中 Apple 已经不支持这个特性了,确实是为了提升电池寿命,这个我们也能够理解

    3、Report CallKit 苹果官方文档就有说,iOS 13 的要求,但是 Xcode 10 打包不支持 Report 所以这个机制可用

    4、擦边球这个,我们推测 WhatsApp 现在就是在用这个机制,所以才想来问一问有没有其他人了解这里,我们也希望能够按要求实现
    icaics
        9
    icaics  
    OP
       2019-12-13 18:15:04 +08:00
    @ichanne 这个我们也尝试过,但是无法拉起 App 做保存信息的动作,我们推测是只能在没 Kill 的情况下处理
    不知道有什么注意事项,如果您之前做过 App 被 Kill 下的动作处理,可以给一些提示吗?谢谢
    haozxuan001
        10
    haozxuan001  
       2019-12-14 14:40:39 +08:00
    @icaics APP kill 后并不是无法通过推送拉起,ios 有两种推送,第一种常见的有消息有提醒的这种无可厚非,第二种就是 5 楼说的,静默推送,官网给出的描述是可以在不前台 APP 的情况下,后台短暂的让 APP 执行一些逻辑,我想这就是你所需要的,至于你回复 5 楼说没办法实现保存这个动作,这个是实现角度,但他的确可以做到。除此之外我想不到任何可能的方案可以在联网前收到推送,断网打开 APP 能看到推送消息这样的逻辑
    Ps:我对移动端的断网操作不清楚,是否可能存在你断开的只是用户层的网络,底层的 ios 层面还可以继续请求?(纯推测)
    MrStark
        11
    MrStark  
       2019-12-14 14:59:57 +08:00
    Mark,我也想知道还有没有其它解决方法。
    icaics
        12
    icaics  
    OP
       2019-12-14 16:29:30 +08:00
    @haozxuan001 感谢提供思路和帮助分析 /抱拳
    icaics
        13
    icaics  
    OP
       2019-12-14 16:42:16 +08:00   ❤️ 1
    @MrStark 目前看只有通过官方提供的后台操作,我找了 [苹果官方的介绍视频]( https://developer.apple.com/videos/play/wwdc2019/707/),但是也只说了 App 在后台存活的时候怎么做到,如果 App 在后台一段时间,被系统 Kill 以后怎么样,这个视频里就没提了

    我推测的是苹果现在只给你后台的操作权限,不给杀掉后在后台拉起的权限,就是为了省电、规范应用

    关键是客户现在不认这套了,就是想要我打开 App 就能看到已经收到过的离线消息,不能等着打开 App 以后再拉取 ...
    xi_lin
        14
    xi_lin  
       2019-12-18 12:53:26 +08:00
    @icaics 不知道 WhatsApp 支持 dark mode 了吗?如果支持了肯定是 11 打包。如果不支持,你看看 info.plist 里有没有加声明只支持 light,如果有那个 key 也是 11 打包。否则就是 10 打包。
    icaics
        15
    icaics  
    OP
       2019-12-20 11:05:41 +08:00
    @xi_lin 好主意!我只看了界面上没有选项,还真没想到看 info.plist,谢谢提醒
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5255 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 09:15 · PVG 17:15 · LAX 02:15 · JFK 05:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.