在 Swift 中为聊天应用程序保持套接字打开

Posted

技术标签:

【中文标题】在 Swift 中为聊天应用程序保持套接字打开【英文标题】:Keeping socket open in Swift for chat application 【发布时间】:2018-01-26 04:23:36 【问题描述】:

我在 php/Ratchet 中有一个可用的聊天服务器。我在 Swift 中使用 Starscream 作为我的客户。我成功地在用户之间创建了一个聊天,但这仅在我的应用程序打开时才有效,因为这是在套接字打开的时候。即使我的应用未打开,如何让我的应用接收消息。所以基本上有办法让套接字保持打开状态。我在某处读到苹果禁止这样做。

【问题讨论】:

【参考方案1】:

您需要与服务器同步。执行以下步骤。

    转储数据库中的每条消息,即带有时间戳的双方对话。

    当应用程序进入后台并进入前台时,刷新屏幕/本地数组上的所有消息以在屏幕上显示消息,调用将获取整个对话的同步服务,因为服务器肯定会收到所有消息,将此服务响应提供给您的屏幕。

ios 系统将在内核级别接收套接字调用,但不会将这些消息传递给您的应用,因此当应用处于后台时您不会收到消息。

    当应用被终止时,您可以从苹果实现 APNS。

【讨论】:

【参考方案2】:

听起来您正在从客户端向您的手机发送消息。您需要将消息发送到服务器,服务器将它们发送到您的手机。

如果服务器无法成功向您的手机发送消息,则应存储该消息,并应在手机可用时将存储的消息发送到该手机。

有这样的消息队列系统。例如,参见 RabbitMQ。还有很多其他的可能更适合您的技术堆栈。做一些研究。

这里客户端与服务器通信,服务器与 RabbitMQ 或您选择使用的任何东西连接,RabbitMQ 跟踪排队的消息,当手机上线时,RabbitMQ 将排队的消息发送到服务器,服务器发送他们到手机上。

PS Google“消息队列 PHP”。

【讨论】:

【参考方案3】:

您的进程很有可能会在某个时候被系统关闭,因此我不会依赖应用程序在后台处于活动状态。

    尝试提出一个解决方案,以便在客户端联机时接收过去的消息。 阅读Apple Push Notification Service 以在应用未激活时通知您的用户有关消息。

【讨论】:

感谢您的快速回复。我正在考虑将所有消息存储在我的数据库中,并在应用程序打开时将它们与用户本地存储同步。那会奏效吗? @Misha Karpenko 是的,我认为这是一个合理的计划。

以上是关于在 Swift 中为聊天应用程序保持套接字打开的主要内容,如果未能解决你的问题,请参考以下文章

在应用程序生命周期Android上保持套接字连接打开

单击按钮时在 Ionic 上保持键盘打开(聊天应用程序)

确认:我可以在保持 TCP 套接字打开的同时调试应用程序吗?

在没有 VoIP iOS 的情况下保持 XMPP 套接字在后台活动

如果一个应用程序打开 2 个 TCP 套接字,是不是会在这两个套接字之间保持有序属性?

用于实现实时聊天应用程序的推送通知与 Web 套接字?