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

时间:2011-04-30 07:40:31

标签: iphone ios background

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

  1. app(用户)将数据发送到服务器,服务器响应数据。
  2. 服务器可能会在不执行任何操作的情况下向应用程序发送数据。
  3. 假设如果应用程序30分钟内未向服务器发送数据,则服务器将关闭连接。即使用户什么也没做,我想保持连接活动120分钟。

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

    案例2 :如果用户按下主页并且应用程序转到后台,我该怎么办?我不想表现出警告或某些事情来打断用户(他不在或正在玩游戏)。我只想让连接保持较长时间,当用户回到应用程序时,他发现连接仍然存在且对此感到满意。

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

    仅使用合法的API,不能越狱。

4 个答案:

答案 0 :(得分:24)

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

请注意,苹果公司对使用背景音频或VOIP API等黑客攻击来保持非音频或VOIP应用的运行感到不满(正如上文中描述的“解决方法”所证明的那样)因此涉及这些技术的风险可能会被拒绝提交。

不幸的是,没有合法的API可以在后台保持连接活动。也许他们会在未来的iOS更新中引入一个,但您可以考虑提交一个feature request来表达对它的支持。

答案 1 :(得分:15)

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

  

实施VoIP应用程序

     

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

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

实施VoIP应用程序是安装Keep-Alive Handler 的一个段落。我很好奇这是否有帮助。如果这解决了你的问题,请给我们一个说明。

答案 2 :(得分:5)

1.使用VOIP属性创建套接字

[inputStream setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;

[outputStream  setProperty:NSStreamNetworkServiceTypeVoIP forKey:NSStreamNetworkServiceType] ;

2.在app.plist

中添加所需的后台模式作为“App提供IP语音服务”

如果您的应用程序处于后台模式,则voip套接字将无法关闭。使用此套接字和uilocal通知即可获得。

  

“如果您的应用程序不是原始的voip应用程序商店   将拒绝“

答案 3 :(得分:3)

当应用程序位于前台时:

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

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

和ActiveMQ经纪人http://activemq.apache.org/

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