iOS - 在整个 iOS 应用程序中实现 websocket 连接的最佳解决方案?

iOS - Best solution for implementing websocket connection across the entire iOS app?

在我的应用程序中,websocket 连接和通信在某个 ViewController 但后来请求通过 websocket 在整个应用程序中接收消息。

最好的方法是什么?将 websocket 代码移动到 AppDelegate 或创建超级 ViewController?或者其他更好的东西?

如果要求您的应用始终与外部方通信并且多个视图控制器可以呈现消息并对其进行操作,那么您需要将通信移出到单独的实例并提供一个接口让您的视图控制器与之交互。

我会创建一个通信 class 或一组 classes,您可以在您的 appDelegate 中创建一个共享实例。然后,不同的视图控制器可以通过 appDelegate 或您提供的其他机制访问此共享实例。

这有多复杂取决于您的具体要求。

编辑以下评论更新要求:

要求似乎是您希望能够始终接收消息,而不管视图控制器如何,但能够通过视图控制器post消息。

为此,您希望共享实例提供 API 用于打开连接。让它注册在 运行loop 上连接的网络套接字(不确定您使用的是哪个网络套接字 API),以便您可以在有 activity 时处理通信没有activity的时候再做其他事情。您可以在主线程或后台线程上执行此操作,这完全取决于您认为消息传递会增加多少负载。

让您的新共享实例处理所有传入消息并将它们放入内部队列。为客户端实例(如您的视图控制器)提供订阅接口以注册传入消息通知。您可以将其设为直接界面或使用通知。您的选择取决于用例。如果视图控制器可以回到过去,那么您需要提供对过去接收和发送的完整消息集的访问。将需要清除这些或缓存到文件的策略,除非消息是短暂的并且您不存储任何历史记录。

对于发送消息,在共享实例中提供一个 API,它允许消息排队等待发送,并在未来确认。使用 运行 循环机制在套接字准备好写入以发送消息时收到通知。向发送方 UI 提供消息发送确认,这样 UI 就不会被阻塞等待发送,并允许在第一条消息未决时写入其他消息。

这里有很多工作要做。