防止进入后台状态 ios swift 时 websocket 连接断开

2024-02-29

经过大量研究后,这似乎是一个灰色地带......

一旦用户进入后台状态(使用 Swift 库 Starscream,但我相信问题出在 iOS 和套接字上),我会尝试通过 websockets 偶尔发送网络请求。用户离开应用程序后不久,套接字连接会自动断开。我认为这与苹果对第三方网络活动的政策有关。

在我的 AppDelegate 中,我尝试在用户离开时重新连接等,但这不起作用。我还听说过涉及播放音频的解决方法,但显然这会阻止我的应用程序发布到应用程序商店(如果不是这种情况,那么为什么以及如何工作?)。其他人说我需要苹果公司的某种资助,我该如何申请?如果有人能澄清这个问题并提供合法的解决方案,那就太好了。我觉得这是应用程序应该具备的功能,所以我正在等待找到解决方案。


我相信没有合法的方法可以真正解决这个问题。 Apple 不希望应用程序在后台执行操作,因为后台活动会消耗大量电池,并且可能会让 iPhone 用户感觉电池续航时间不够(此外还有“无法解释的”网络使用等其他问题) ,因此为了用户体验,他们仅提供有关 iOS 应用程序后台活动的非常有限的选项。但是,我们可以通过某些方式使应用程序保持活动状态:

来自iOS 应用程序编程指南 https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html:

当您发现有必要让应用程序在后台运行时,iOS 可以帮助您高效地完成此操作,并且不会耗尽系统资源或用户的电池。 iOS 提供的技术分为三类:

  • 在前台启动短任务的应用程序可以在应用程序移至后台时请求时间来完成该任务。
  • 在前台启动下载的应用程序可以将对这些下载的管理移交给系统,从而允许应用程序在下载继续时暂停或终止。
  • 需要在后台运行以支持特定类型的应用程序 任务可以声明支持一个或多个后台执行 模式。

如此看来,除了要求iOS允许应用程序完成短任务或下载之外,请求系统允许应用程序在后台运行的唯一方法就是在我们的程序中指定后台执行模式。Info.plist。这可以在 XCode 中完成Capabilities对话框,或直接编辑属性列表文件。让我们检查一下我们有哪些可用的后台执行模式:

在 iOS 中,只允许特定的应用程序类型在后台运行:

  • 在后台向用户播放音频内容的应用程序,例如音乐播放器应用程序
  • 在后台录制音频内容的应用程序
  • 让用户随时了解其位置的应用程序,例如导航应用程序
  • 支持互联网语音协议 (VoIP) 的应用
  • 需要定期下载和处理新内容的应用
  • 从外部配件接收定期更新的应用程序

保持套接字处于活动状态可能属于“需要定期下载和处理新内容的应用程序”用例,所以让我们检查一下:

机会主义地获取少量内容

需要定期检查新内容的应用程序可以要求系统唤醒它们,以便它们可以启动该内容的获取操作。要支持此模式,请从 Xcode 项目中“功能”选项卡的“后台模式”部分启用“后台获取”选项。 (您还可以通过在应用程序的 Info.plist 文件中包含带有提取值的 UIBackgroundModes 键来启用此支持。)启用此模式并不能保证系统会给您的应用程序任何时间执行后台提取。系统必须平衡应用程序获取内容的需求与其他应用程序和系统本身的需求。评估这些信息后,系统会在有合适的机会时为应用程序提供时间。

因此,此选项似乎仅适用于通过 HTTP 请求(或其他网络请求)获取少量内容,不适用于 websocket 允许您使用的双向持续通信。事实上,看着其他相关答案 https://stackoverflow.com/questions/8261135/how-to-keep-iphone-ios-xmpp-connection-alive-while-in-the-background/11022682#11022682,当应用程序进入后台模式时,似乎确实没有合法的方式来保持套接字打开。

这意味着,要执行您想要的操作,您不能使用 Websocket 作为唯一的通信渠道。我建议您使用fetch后台模式(如上所述),以便在应用程序处于后台时获取比使用 websocket 更大的块内容,或者如果您希望用户能够看到新内容可用,您可以实现推送通知 https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1.

您不能使用推送通知直接发送大量内容,但它们可以用于提示用户在打开您的应用程序时有新内容可用。无论您使用后台获取还是推送通知,您都应该在应用程序委托上实现方法,每当您的应用程序从后台状态恢复时,该方法都会将应用程序的状态与后端的状态同步。

最后,关于使用音频作为解决方法:audio背景状态键将允许您的应用程序在后台无限期地保持活动状态 - 但如果您的应用程序没有真正使用它来播放音频,那么它will被应用商店拒绝。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止进入后台状态 ios swift 时 websocket 连接断开 的相关文章

随机推荐

  • 简单的 PHP 联系表格未发送[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 发完更多帖
  • 如何在Steam WebAPI中通过AppName获取steam AppID

    所以我试图通过输入游戏名称来启动蒸汽游戏 为此我问自己是否可以通过输入的名称找出steam App ID 所以我尝试通过我的 steamApps 文件夹收集 ID 但没有成功 我还找到了一个网站 您可以在其中搜索特定游戏的名称 例如 htt
  • 期间发生内部错误:“更新 Maven 项目

    当我转换为 Maven 项目时 错误是 gt An internal error occurred during Updating Maven Project gt Unsupported IClasspathEntry kind 4 有什
  • 使用 Ajax 下载 JQuery 文件

    当我的用户选择生成报告时 我使用 John Culviner 出色的 fileDownload 插件来生成 请稍候 消息 当用户单击链接时 我向 PHP 发送一个 ajax 请求 该请求在服务器上生成 PDF 此时 我正在尝试更新 file
  • 调用未定义的函数curl_init(),即使它在php7中启用

    我刚刚在我的 Ubuntu 上安装了 php7 起初 没有任何问题 我的网站可以运行 但突然间 它开始返回 Call to undefined function curl init 错误 现在 我的页面包含的curl代码不起作用 在 php
  • 在 SwiftUI 3.0 iOS 15 中调整视图与键盘显示

    我的注册页面有VStack嵌入一 个ScrollView嵌入在VStack 在最里面VStack我有一系列TextField与定制TextFieldStyle 注册页面的 UI 如下所示 VStack ScrollView VStack s
  • Azure Powershell Linux

    除了 Linux Azure Powershell 之外 是否还有更多适用于 Linux Azure Powershell 的 cmdlet 是否有 Azure Powershell 的官方存储库对于Linux 有没有办法让终端在启动时启动
  • android 中的 vimeo 视频为 .mp4 格式

    我想在我的 Android 应用程序中播放 vimeo 视频 要播放我需要 mp4 格式的视频 我在下面的链接中有用户将视频获取为 mp4 格式 当我在浏览器中点击此网址时 它会要求我将文件另存为 mp4 格式 但是当我尝试通过编码获得相同
  • 自定义绘制控件的糟糕性能

    我正在做简单的图形控制wpf 我无法解释也无法解决性能问题 与 winform 相比 它太慢了 也许我做错了什么 我准备了demo来演示这个问题 这是测试控制 public class Graph FrameworkElement priv
  • 如何在 IIS 上使用 ASP.NET Core 3.1 API 部署 Angular SPA?

    我想象应该是简单的场景 有 Angular 8 SPA ASP NET Core 3 1 Web API 想在Windows Server上部署IIS的已通读 使用 IIS 在 Windows 上托管 ASP NET Core https
  • C++ 查找单词中的 Anagrams

    我正在开发一个程序 该程序使用以下命令来检查特定单词是否是字谜词std count但是 我认为我的功能逻辑不正确 而且我似乎无法弄清楚 假设文件中有以下单词 Evil Vile Veil Live 我的代码如下 include
  • PowerMock:模拟私有静态最终变量,具体示例

    要通过此测试必须进行的绝对最小模拟是什么 code class PrivateStaticFinal private static final Integer variable 0 public static Integer method
  • 使用 ODBC 转义包含问号的访问表名称

    我有一个Access数据库要查询如下 id name Print 1 one Yes 2 two No 现在 我在 java 中的查询 使用带有 ODBC 连接器的PreparedStatement 如下所示 select from tab
  • 将 pandas GroupBy 中的列值聚合为字典

    这是我之前面试的时候也问过的问题 我们的输入数据具有以下列 语言 产品 ID 货架 ID 排名 例如 输入将具有以下格式 English 742005 4560 10 2 English 6000075389352 4560 49 Fren
  • 如何左移一位特定位?

    我只想在特定位置左移一位 保留其位置0 所以我不想用 lt lt 运算符 这是一个示例 假设变量具有值1100 1010我想移动第四位那么结果应该是1101 0010 到达那里的步骤 从原始数字中提取位值 将位值左移一位 将位移后的值合并回
  • 幂集生成函数的时间复杂度

    我试图计算出我编写的函数的时间复杂度 它生成一个电源组 http en wikipedia org wiki Power set对于给定的字符串 public static HashSet
  • 高效浮点比较 (Cortex-A8)

    有一个很大的 100 000 数组floating点变量 并且有一个阈值 也floating point 问题是我必须将数组中的每个变量与阈值进行比较 但 NEON 标志传输需要非常长的时间 根据探查器 约为 20 个周期 有没有有效的方法
  • 使用 nginx 通过 index.php 路由请求 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在将我的服务器从 Apache 迁移到 Nginx 这非常简单 htaccess rule RewriteEngine On RewriteCon
  • 在 ssl (ldaps) 的支持下连接活动目录

    我正在尝试在 ssl 的支持下连接活动目录 我尝试了以下网站中的步骤 http confluence atlassian com display CROWD Configuring an SSL Certificate for Micros
  • 防止进入后台状态 ios swift 时 websocket 连接断开

    经过大量研究后 这似乎是一个灰色地带 一旦用户进入后台状态 使用 Swift 库 Starscream 但我相信问题出在 iOS 和套接字上 我会尝试通过 websockets 偶尔发送网络请求 用户离开应用程序后不久 套接字连接会自动断开