我认为没有合法的方法可以真正解决这个问题。苹果不希望应用在后台执行操作,因为后台活动会大量消耗电池,并可能使iPhone用户感到电池续航时间不够长(除了其他问题,如“未经解释”的网络使用等),因此他们仅针对用户体验提供非常有限的iOS应用程序后台活动选项。然而,我们可以通过某些方式保持应用程序处于活动状态:
来自
iOS应用程序编程指南:
当您需要让应用程序在后台运行时,iOS 可以帮助您高效地实现此目的,而不会消耗系统资源或用户的电池电量。iOS 提供的技术可以分为三类:
- 在前台启动短任务的应用程序可以在应用程序进入后台时请求时间以完成该任务。
- 在前台启动下载的应用程序可以将这些下载的管理权交给系统,从而允许应用程序在下载继续进行时被挂起或终止。
- 需要在后台运行以支持特定类型任务的应用程序可以声明其支持一个或多个后台执行模式。
因此,除了请求 iOS 允许应用程序完成短任务或下载之外,请求系统允许应用程序在后台运行的唯一方法是在我们的 Info.plist 中指定后台执行模式。这可以通过 XCode 项目的 Capabilities 对话框或直接编辑属性列表文件来完成。让我们检查一下有哪些后台执行模式可用:
在iOS中,只有特定类型的应用程序被允许在后台运行:
- 播放声音内容给用户听的应用程序,例如音乐播放器应用程序
- 在后台录制音频内容的应用程序
- 随时通知用户其位置的应用程序,例如导航应用程序
- 支持VoIP(互联网语音)的应用程序
- 需要定期下载和处理新内容的应用程序
- 从外部配件接收定期更新的应用程序
保持套接字活动可能属于“需要定期下载和处理新内容的应用程序”用例,因此让我们检查一下:
机会性地获取少量内容
需要定期检查新内容的应用程序可以请求系统唤醒它们,以便它们可以启动获取该内容的操作。为支持此模式,请从Xcode项目的功能选项卡中的背景模式部分启用后台获取选项。(您还可以通过在应用程序的Info.plist文件中使用具有获取值的UIBackgroundModes键来启用此支持。)启用此模式不能保证系统将给予您的应用程序任何时间来执行后台获取。系统必须平衡您的应用程序获取内容的需求与其他应用程序和系统本身的需求。在评估了那些信息之后,系统会在有良好机会时给予应用程序时间。
因此,看起来这个选项只能通过HTTP请求(或其他网络请求)获取少量内容,而不能像websocket一样进行双向持续通信。实际上,从其他相关答案中看来,似乎没有合法的方法在应用程序进入后台模式时保持套接字打开。
这意味着,为了实现你想要的功能,你不能仅使用websockets作为通信渠道。我建议你要么使用
fetch
背景模式(如上所述)以便在应用程序处于后台时获取比使用websocket更大的内容块,要么如果你希望用户能够看到新内容可用,可以实现
推送通知。无论你使用后台获取还是推送通知,你都应该在App Delegate上实现方法,以便在将应用程序从后台状态带回时将应用程序的状态与后端的状态同步。
最后,关于使用音频作为解决方法:
audio
后台状态密钥将允许您的应用程序无限期地保持在后台运行状态 - 但如果您的应用程序不真正使用它来播放音频,它将被应用商店拒绝。