在 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 中为聊天应用程序保持套接字打开的主要内容,如果未能解决你的问题,请参考以下文章
确认:我可以在保持 TCP 套接字打开的同时调试应用程序吗?
在没有 VoIP iOS 的情况下保持 XMPP 套接字在后台活动