iOS VoIP 应用程序在一段时间后从后台退出
我将 .plist 设置为在后台运行应用程序,并设置了如下连接:
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];
此外,我还将 Stream() 设置为在收到数据时调用。 然后我从/向服务器读取写入。 这是工作。也在后台。但几分钟后(仅在后台模式下!)服务器打印到日志“java.net.SocketTimeoutException:读取超时”。并且不再与客户端(iOS 设备)连接。
我还没有设置后台处理程序来保留连接 - 但没有这个处理程序它应该可以工作(我认为..)!
我是否错过了这个套接字配置的某些内容?
I set my .plist to run the application while background and I've set up the connection like this:
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];
Also I set my stream() to be called when data is received.
Then I read an write from/in server.
It's work. on backgrount too. but after few minutes (in backgound mode only!) the server print into the log "java.net.SocketTimeoutException: Read timed out". and no more connection with the client (iOS device).
I've not set background handler to retiain connection - but it should be work without this handler (I think..)!
Did I missed something with this socket configurations?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
VoIP 应用程序在后台有限制。简而言之:
这是另一个线程上更详细答案的链接:
后台 VoIP 应用行为
VoIP app has restrictions at background. In short:
Here is a link to a more detailed answer on another thread:
VoIP app behavior at background