iOS 应用程序如何在后台无限期地保持 TCP 连接处于活动状态?

Posted

技术标签:

【中文标题】iOS 应用程序如何在后台无限期地保持 TCP 连接处于活动状态?【英文标题】:How can an iOS app keep a TCP connection alive indefinitely while in the background? 【发布时间】:2011-08-15 23:17:49 【问题描述】:

一个 iPhone 应用程序,通过 TCP 连接到远程服务器。使用场景有:

    应用(用户)向服务器发送数据,服务器回复数据。 服务器可能会在不执行任何操作的情况下向应用发送数据。

假设应用程序在 30 分钟内没有向服务器发送数据,服务器将关闭连接。即使用户什么都不做,我也想让连接保持 120 分钟。

案例 1:如果应用程序在前台,我可以使用计时器向服务器发送一些无操作数据。没问题。

案例 2:如果用户按下 Home 并且应用程序进入后台,我该怎么办?我不想显示警报或打断用户的东西(他不在或玩游戏)。我只是想让连接保持更长时间,当用户回到应用程序时,他发现连接仍然存在并且对此感到满意。

我已阅读有关 iphone API 的后台执行、多任务处理和本地通知的文档。 我不确定是否可以实现案例 2

只使用合法的API,不越狱。

【问题讨论】:

这是一个非常古老的线程,但我只想提一下,所有建议伪装成 VoIP 应用程序的答案都不再可行,除非您愿意使用 Xcode 7 进行开发并且在未来几年内可能面临无法运行的情况。 forums.developer.apple.com/thread/49363 【参考方案1】:

Tapbots 通过提示用户始终运行silent background audio track 解决了这个问题。

请注意,Apple 不赞成使用诸如使用背景音频或 VOIP API 来保持非音频或 VOIP 应用程序运行(如上文中描述的“解决方法”所证明的那样)的黑客行为,因此涉足这些技术可能会被拒绝提交。

不幸的是,没有合法的 API 可以在后台保持连接处于活动状态。也许他们会在未来的 ios 更新中推出一款,但您可以考虑提交 feature request 以表达您对它的支持。

【讨论】:

很好的答案,非常感谢。您提到 Pastebot 的链接对我帮助很大。【参考方案2】:

请查看 Apple 的 iOS 应用程序编程指南中的 Implementing a VoIP Application。这不是经过测试的解决方案,但我认为它可以用来实现您的要求。

实施 VoIP 应用程序

互联网协议语音 (VoIP) 应用程序允许用户使 使用互联网拨打电话 连接而不是设备的 蜂窝服务。这样的应用 需要维护一个持久的网络 与其相关服务的连接 以便它可以接收来电 和其他相关数据。而不是 让 VoIP 应用程序保持清醒 时间,系统允许他们 暂停并提供设施 为他们监视他们的套接字。 当检测到传入流量时, 系统唤醒 VoIP 应用程序 并将其套接字的控制权返回给 它。

我不确定您是否正在开发 VoIP 应用程序,但您将能够访问套接字并对传入的数据包做出反应。引用后的文本是指[setKeepAliveTimeout:handler:][2],它允许您设置一个代码块,使您可以保持(您的 VoIP)连接。不过,最短调度时间是 10 分钟。

在实现 VoIP 应用程序中有一段关于安装 Keep-Alive 处理程序。我很好奇这是否会有所帮助。如果这解决了您的问题,请给我们留言。

【讨论】:

从技术上讲,我认为您的回答可能会解决我的问题。但是,我不是在开发 VoIP 应用程序。根据所有答案和我所知道的,我“确实”必须使用某种“解决方法”来解决我的问题。感谢您的帮助。 没错,只是尝试使用 Apple 为 VoIP 应用程序实施的机制来保持连接。【参考方案3】:

1.使用这样的VOIP属性创建您的套接字

[inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;

[outputStream  setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;

2.在app.plist中添加所需的后台模式为“App提供IP语音服务”

如果您的应用程序处于后台模式,则 voip 套接字将不会关闭。将此套接字与 uilocal 通知一起使用,您可以获得。

"如果您的应用程序不是原始的 voip 应用程序应用商店 会拒绝”

【讨论】:

【参考方案4】:

当应用在前台时:

看STOMPhttp://stomp.codehaus.org/Protocol

Obj-C 中的 STOMP 框架http://code.google.com/p/stompframework/

和 ActiveMQ 代理 http://activemq.apache.org/

当应用程序处于后台时,我可能会使用 APNS(通知)来提示用户唤醒应用程序备份...

【讨论】:

我不想将应用程序带到前台,除非用户明确按下我的应用程序的图标。我不太明白你为什么提到 STOMP 和 ActiveMQ? 再想一想,我想我误解了这个问题,并在考虑一个简单的保持活动问题......这里提到的无声音轨也是一个很好的范例,虽然可能不赞成,但仍然被批准。 .

以上是关于iOS 应用程序如何在后台无限期地保持 TCP 连接处于活动状态?的主要内容,如果未能解决你的问题,请参考以下文章

在后台无限期地运行应用程序进程

iOS后台保活

如何让应用程序无限期地在后台运行?

iOS - 当应用程序在后台时取消蓝牙连接

没有位置服务的 iOS 后台轮询

iBeacons 在 iOS 中以后台模式扫描?