iphoneOS后台插座

时间:2011-12-23 18:16:52

标签: ios sockets background

我有一个简单的TCP客户端连接到一个简单的TCP服务器,每隔5秒发送一次“ping”一词。我使用从标准C套接字库中读取的命令读取这些“ping”。

int numberOfBytes = read(m_clientSocketFileDescriptor,buffer,255);
if (numberOfBytes < 0) { 
    error("reading from socket");
}

我在应用程序plist文件中设置了WIFI用法,背景声音和背景voip值。 我声明我的套接字如下:

 - (void)applicationWillEnterForeground:(UIApplication *)application
 {
   if (m_clientSocketFileDescriptor) {
         CFStreamCreatePairWithSocket(kCFAllocatorDefault, m_clientSocketFileDescriptor, &m_tcpReadStream, nil);
         if (m_tcpReadStream != NULL) {
         CFReadStreamSetProperty(m_tcpReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
         }
    }
  }

当我按下主页按钮时,此功能非常有效。我的ping是从服务器收到的,当我唤醒我的应用程序时,所有的消息都已收到。 我的问题是当我使用电源按钮锁定iPhone屏幕时。套接字实际上是关闭的。我的服务器收到一个SIGPIPE错误,当我唤醒手机时,read()函数说:“Socket没有连接”。

我认为如果在用户锁定屏幕时这种情况下降,那么拥有一个后台套接字是非常愚蠢的(默认情况下,这种情况发生在1到5分钟之间),所以也许我正在以错误的方式做事。

有没有人设法克服这个问题? 在iOS 5.0上测试,带有iphone 3GS&amp; iphone 4。

1 个答案:

答案 0 :(得分:0)

您可能需要使用-[UIApplication setKeepAliveTimeout:handler:]。我想如果你没有这个处理程序,操作系统可以假设你的应用程序无论如何都无法处理对套接字的任何响应并关闭它。另请参阅Apple's Tips for Developing a VoIP app