iOS VoIP 应用程序在一段时间后从后台退出

发布于 2025-01-05 10:15:07 字数 1733 浏览 4 评论 0原文

我将 .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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

楠木可依 2025-01-12 10:15:07

VoIP 应用程序在后台有限制。简而言之:

  • 当应用程序处于后台时,它大部分时间都处于挂起状态
  • 当它挂起时,操作系统使您的套接字保持活动状态
  • 应用程序从挂起状态中唤醒:传入数据、网络更改以及执行 KeepAlive 以让服务器知道其处于活动
  • 状态音频处于活动状态(有活动的 VoIP 呼叫),应用程序可能在后台完全运行。

这是另一个线程上更详细答案的链接:
后台 VoIP 应用行为

VoIP app has restrictions at background. In short:

  • While app is at background, it is suspended most of the time
  • While it is suspended, the OS keeps your socket alive
  • App wakes up from suspention for: incoming data, network changes and performing KeepAlive to allow the server know its alive
  • While Audio is active (There is an active VoIP call), app may run fully at background.

Here is a link to a more detailed answer on another thread:
VoIP app behavior at background

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文