TL;DR:您会喜欢WebSocket + Combine框架,通过事件驱动使您的UI平稳更新。APNS在交付能力和资源/数据库成本方面有些不可靠,对我来说更像是一个信息中心。
WebSockets让您喜欢的原因:
- 降低数据库成本(例如查找要发送的设备)
- 您知道用户何时未使用应用程序,从而减少传出数据成本
- 更低延迟和更快速度(websocket段落中更深入)
回答问题:WebSocket基于用户数量可扩展。 APNS在CI中无法进行服务器端测试,不跨平台,并且在资源消耗方面并不实际可行。
我对WebSockets有一种偏见。但是为了说明我更喜欢它的原因,请考虑Instagram示例所提供的效率。
对我而言,WebSockets ==事件驱动,APNS是简单的信息中心。
APNS:
您在APNS上注册并将设备保存在后端。很好,每次执行操作(例如某人喜欢您的帖子),都会查询您的后端,找到与OP相关联的设备,然后发出外部请求(如果您认为云计算成本是金钱)。每当有人喜欢您的帖子时,您都必须这样做(显然可以聚合,但是如果有WebSocket,为什么要麻烦呢?)。
因此,数据库成本是要考虑的一个问题。此外,用户可能会将其通知静音。我没有Instagram,但是在效率方面,他们可以采用以下方法(如果不是通过套接字):根据收到的喜欢/心形通知更新其UI,而不是通过WebSocket连接。 从延迟、成本和被标记为垃圾邮件的可靠性来看,这很慢。但是,APNS的好处是不需要授权,不像WebSocket,但是...
WebSockets:
当我们接近WebSocket时,您仅需一次授权(至少对于移动应用程序)。通过删除诸如报头之类的内容,您正在消除传出数据成本(以$$和延迟表示)。您希望发送小块数据,而套接字只是发送文本/二进制数据(我喜欢使用JSON将它们创建为命令。其中一个显着的例子是GitHub)。当用户完成应用程序后,关闭连接,您不需要通过APNS再发送任何数据。您的服务器本身可以通过Redis PubSub之类的东西与单个WebSocket进行通信,以更新您的UI,当某人使用POST请求“点赞”帖子而无需发送任何推送通知时。对于点赞者(无需等待发送推送通知)或向后台任务卸载它的另一种方式(OP不需要等待),这是一个胜利。WebSockets ==事件驱动:
- 频繁传输小数据块比使用APNS更好,因为后者可能传送缓慢,尤其是当您向苹果或用户发送大量通知时,会被标记为垃圾邮件。不过需要说明的是,这只是我个人的看法和根据您的用例所做的推测。
- 使用WebSocket可以减少不必要的数据库成本。
- 缺点是需要保持连接。
个人而言,我最近在聊天应用中使用了结合框架的WebSocket技术,但它也可以在很多不同的情况下使用,例如更新Facebook动态/评论区、通过WebSocket实现实时通知而非APNS、甚至发布内容等。