使用 APNS(带或不带 AWS SNS)实时更新聊天应用程序?

Posted

技术标签:

【中文标题】使用 APNS(带或不带 AWS SNS)实时更新聊天应用程序?【英文标题】:Updating Chat App in Real Time Using APNS (with or without AWS SNS)? 【发布时间】:2018-10-04 03:40:01 【问题描述】:

我正在用 Swift 编写一个消息传递应用程序,人们可以在其中进行类似于短信或其他流行聊天应用程序的工作方式的聊天。支持 API 在 AWS 上,用 C# 编写。

这里有一些兴趣点:

    希望避免使用 Firebase 等第三方内容,但愿意听取建议 目前不需要警报通知 - 没有弹出窗口、横幅等。只想在一个视图控制器上实时显示消息气泡 - 当且仅当该人盯着消息屏幕时。如果它们位于应用程序的其他位置,则不会发生任何事情。

    我们不想提示用户询问他们是否同意此应用发送通知,因为我们不会向他们发送横幅或任何视觉内容,除了新的聊天到达。这是APNS的要求吗?我觉得这意味着有人可以说不,然后我们无法实时更新聊天应用程序,这不会飞。

    我假设一种简单的方法是某种计时器/循环,它从消息视图控制器运行,每隔一两秒它就会访问 API 并询问是否有新消息,但这对我来说似乎本质上是错误的 - 应用程序必须是健壮的,并且可能有成千上万或数十万人在使用它 - 这是很多 API 请求,并且在许多情况下可能没有新消息,因此浪费了调用。这显然不是要走的路,对吗?

问题 #1 我当时在想,我应该使用 APNS,但不确定它是否要求您提示用户请求他们允许从 Apple 接收任何东西?我再次担心的是聊天气泡应该实时出现,并且不想让用户以某种方式看不到这些(破坏应用程序)

如果 APNS 是要走的路,并且我必须提示他们,那么我假设流程是我将收集我的设备 ID(在 appdelegate 中创建,保存在我的 C# 数据库中,并与每个消息线程相关联)并且每当有人键入一条消息,它转到我的 API,我将它保存在消息数据库表中,然后我向 APNS 发送一条消息到每个人的设备 ID。

Apple 将其排队,然后发送给每个人,如果他们在屏幕上,那么消息就会进来。

这就是我应该如何利用 APNS 来实现我想要的吗?

问题 #2 我看到其他人推荐使用 SNS(与 APNS 结合使用),但我不明白为什么。 APNS 不是既可以作为适当的队列,也可以作为通知服务,从而完全不需要使用 AWS 的 SNS/SQS?这对我来说似乎是多余的,但也许我只是不明白为什么需要这两种技术背后的想法。

提前感谢任何人的时间,如果他们可以为我阐明这一点!

谢谢!

【问题讨论】:

使用 WebSockets。 看起来不错,谢谢。像这样的东西,甚至(红蜘蛛)raywenderlich.com/861-websockets-on-ios-with-starscream - WebSockets 是否会耗尽电池,或者是因为我只在消息视图控制器(新聊天到达的地方)上这样做,所以它的电池消耗有限? 【参考方案1】:

问题 1

即使您使用的是 WebSockets(正如@stevenpcurtis 提到的),您仍然需要通知用户当应用程序处于后台/挂起时用户收到消息的事实。是的,您必须“强制”您的用户为应用程序启用通知并解释他为什么需要它。根据经验,如果用户安装了 messenger,他就会明白通知的用途以及启用它的原因。

问题 2

从移动的角度来看,当用户在应用程序处于后台或挂起时收到通知时,SNS 仍会发送推送通知。从后端的角度来看,您可以使用 SNS。

结论:

从移动的角度来看,您有 2 种模式:

应用程序处于活动状态 - 通常由您决定如何接收消息。 (Web 套接字、推送等) 应用程序在后台或被挂起:您需要一个工具来通知用户更改,而无需控制应用程序。这是推送通知服务的工作。从后端发送推送的方式取决于您。

您也可以查看This question 以获取更多信息。

【讨论】:

感谢您的回复,谢谢 - 我认为对我来说,问题变成了如果用户说他们不希望收到通知怎么办 - 那么我应该终止应用程序吗?也似乎是一个糟糕的用户体验。我想知道 WhatsApp 在这方面做了什么——我觉得如果你对允许通知说“不”,他们的聊天应用程序仍然有效(实时消息仍然进来)——我怀疑他们只是阻止你使用该应用程序,而且我敢肯定,如果您在视图控制器上,他们仍然能够让消息实时到达。 关于 SNS 的另一件事 - 我仍然不了解它的需要,因为我可以从我的 API 推送到 APNS。 SNS 提供了哪些 APNS 没有提供的功能? @NullHypothesis,不!您永远不应该终止应用程序。您的责任是警告用户,如果他拒绝允许通知,他只会在应用程序处于活动状态时收到聊天消息。关于 SNS - 它只是一个方便的工具。如果您可以从自己的 api 发送推送 - 这对您有用。 谢谢!我倾向于raywenderlich.com/861-websockets-on-ios-with-starscream 你对为什么这可能是个坏主意有什么想法吗?看来 websockets 可能会得到我现在想要的东西! @NullHypothesis 关于套接字教程 - 这取决于您的要求。有些人构建了高度可扩展的信使,以便每天能够接收数百万条消息。为此,我建议找到经过测试的企业解决方案或强大的专业团队。对于更适度的需求,本教程中的解决方案可能工作得很好。

以上是关于使用 APNS(带或不带 AWS SNS)实时更新聊天应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

使用带或不带括号的 python 装饰器

使用参考值作为参数,带或不带“ref”? [复制]

带或不带`.min`的样式表参考

将字符串表示为决策树中的特征,词汇量为 200(带或不带 one-hot 编码)

在 ES6 中导入带或不带大括号 [重复]

定义带或不带导出的变量