iOS-приложение VoIP выходит из фонового режима через некоторое время - PullRequest
0 голосов
/ 12 февраля 2012

Я установил свой .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];

Также я установил свой поток () для вызова при получении данных.Затем я читаю запись с / в сервер.Это работает.на фоне тоже.но через несколько минут (только в режиме backgound!) сервер печатает в журнале «java.net.SocketTimeoutException: Read timed out».и больше нет соединения с клиентом (устройством iOS).
Я не установил фоновый обработчик для повторного установления соединения - но он должен работать без этого обработчика (я думаю ..)!что-то с этой конфигурацией сокета?

1 Ответ

0 голосов
/ 10 мая 2012

Приложение VoIP имеет ограничения в фоновом режиме.Вкратце:

  • Пока приложение находится в фоновом режиме, оно большую часть времени приостанавливается
  • Пока оно приостановлено, ОС поддерживает работу вашего сокета
  • Приложение запускаетсяпо сравнению с приостановкой для: входящих данных, изменений в сети и выполнения KeepAlive, чтобы сервер знал, что он активен
  • Когда звук активен (имеется активный вызов VoIP), приложение может работать полностью в фоновом режиме.

Вот ссылка на более подробный ответ в другой ветке: Поведение VoIP-приложения на фоне

...