2012-02-12 83 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