一个iOS应用程序如何在后台保持TCP连接无限期地运行?

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

  1. 应用程序(用户)发送数据到服务器,服务器响应数据。
  2. 服务器可能会发送数据到应用程序,而它什么也不做

假设如果应用程序不发送数据到服务器30分钟,服务器将closures连接。 即使用户什么也不做,我想保持连接120分钟。

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

情况2 :如果用户按Home并且app进入后台,我该怎么办? 我不想显示警告或什么东西来中断用户(他离开或玩游戏)。 我只是想保持连接长时间的活跃,当用户回到应用程序,他发现连接将仍然活着,并为此感到高兴。

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

只有使用合法的API,没有越狱。

Tapbots通过提示用户随时运行无声背景音轨来解决这个问题。

请注意,苹果公司不喜欢使用诸如使用背景audio或VOIP API之类的黑客来保持非audio或VOIP应用程序运行(如上面文章中描述的“解决方法”所certificate的),因此涉及这些技术的风险在提交时可能被拒绝。

不幸的是,在后台保持连接不存在合法的API。 也许他们会在iOS的未来更新中介绍一个,但是您可能会考虑提交一个function请求来声明对它的支持。

请看“苹果iOS应用程序编程指南”中的“ 实现VoIP应用程序”。 这是没有经过testing的解决scheme,但我认为它可以用来实现你所要求的。

实施VoIP应用

互联网协议语音(VoIP)应用程序允许用户使用互联网连接而不是设备的蜂窝服务来拨打电话。 这样的应用程序需要与其关联的服务保持永久的networking连接,以便能够接收来电和其他相关数据。 系统不是一直让VoIP应用程序保持清醒状态,而是允许它们被挂起,并提供监视其sockets的设施。 当检测到传入stream量时,系统唤醒VoIP应用程序并将其套接字的控制返回给它。

我不知道你是否正在开发一个VoIP应用程序,但你将能够访问套接字,并对传入的数据包作出反应。 引用后面的文字指的是[setKeepAliveTimeout:handler:][2] ,它允许你设置一个代码块让你保持活着(你的VoIP)连接。 最小调度时间是10分钟,但。

在实施一个VoIP应用程序是一个关于安装保活处理程序的段落。 我很好奇,如果这将有所帮助。 如果这解决了您的问题,请给我们一个笔记。

1.使用VOIP属性创build你的socket

 [inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ; [outputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ; 

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

如果您的应用程序在后台模式下,voip套接字将不会closures。 使用这个套接字与uilocal通知,你可以得到。

“如果你的应用不是原创的voip应用,app store将拒绝”

当应用程序在前台时:

看看STOMP http://stomp.codehaus.org/Protocol

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

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

对于当应用程序在后台时,我可能会去使用APNS(通知)提示用户唤醒应用程序备份…