2012-02-12 104 views
0

设置我的.plist运行,而后台的应用程序,我已经建立了这样的连接:iOS的VoIP应用退出

CFReadStreamRef  readStream; 
CFWriteStreamRef writeStream; 

//open c socket: 
int rc; // ret code of s.c. 
int my_socket; 
struct sockaddr_in dest_addr; 

my_socket = socket(AF_INET, SOCK_STREAM, 0); 
assert(my_socket >= 0); 

dest_addr.sin_family = AF_INET; 
dest_addr.sin_port = htons(SERVER_LOC_PORT); 
dest_addr.sin_addr.s_addr = inet_addr(SERVER_IP); 

memset(dest_addr.sin_zero, 
     '\0', 
     sizeof dest_addr.sin_zero); 

rc = connect(my_socket, 
      (struct sockaddr *)&dest_addr, 
      (socklen_t) sizeof(dest_addr)); 

if(rc != 0){ 
    return NO ; 
} 

NSLog(@"Start connection"); 

// Open a stream based on the existing socket. Then configure 
// the stream for async operation. 

CFStreamCreatePairWithSocket(NULL, my_socket, &readStream, &writeStream); 
assert(readStream != NULL); 

self.networkStreamIn = (NSInputStream *) readStream; 
self.networkStreamOut = (NSOutputStream *) writeStream; 

//releasers 
CFRelease(readStream); 
CFRelease(writeStream); 

self.networkStreamIn.delegate = self; 
self.networkStreamOut.delegate = self; 
BOOL res = [self.networkStreamIn setProperty:NSStreamNetworkServiceTypeVoIP 
        forKey:NSStreamNetworkServiceType]; 

if(!res){ 
    NSLog(@"Cannot connect") ; 
    // @TODO: Error handling here 
} 

[self.networkStreamIn scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

[self.networkStreamIn open]; 
[self.networkStreamOut open]; 

我也把我的流()是在收到数据时调用。 然后我读取/从服务器写入。 这是工作。在backgrount上。但几分钟后(仅在backgound模式!)服务器打印到日志“java.net.SocketTimeoutException:读取超时”。并且不再与客户端(iOS设备)建立连接。
我没有设置后台处理程序来重新连接 - 但它应该是没有这个处理程序的工作(我想..)!

我错过了这个套接字配置的东西吗?

回答

0

VoIP应用在后台有限制。总之:

  • 当应用程序在后台,其悬挂的大部分时间
  • 虽然被暂停,操作系统让你的插座活着
  • 应用程序从对悬浮液中苏醒:输入数据,网络更改并执行KeepAlive以允许服务器知道其活动
  • 音频处于活动状态(存在活动的VoIP呼叫)时,应用可能会在后台完全运行。

这里是一个更详细的解答的链接在另一个线程: VoIP app behavior at background