2012-02-12 6 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: Read timed out». и больше нет связи с клиентом (устройство iOS).
Я не устанавливал обработчик фона для соединения retiain - но он должен работать без этого обработчика (я думаю ..)!

Я пропустил что-то с этой конфигурацией гнезда?

ответ

0

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

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

Вот ссылка на более подробный ответ на другую тему: VoIP app behavior at background

Смежные вопросы