2011-12-23 26 views
1

我有一個簡單的TCP客戶端,它連接到一個簡單的TCP服務器,每5秒發送一個字「ping」。我使用從標準C套接字庫讀取的命令讀取這些「ping」。iphoneOS背景插座

int numberOfBytes = read(m_clientSocketFileDescriptor,buffer,255); 
if (numberOfBytes < 0) { 
    error("reading from socket"); 
} 

我已經在我的應用程序plist文件中設置了WIFI用法,背景音和背景voip值。 我宣佈我的插座後臺運行如下:

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    if (m_clientSocketFileDescriptor) { 
     CFStreamCreatePairWithSocket(kCFAllocatorDefault, m_clientSocketFileDescriptor, &m_tcpReadStream, nil); 
     if (m_tcpReadStream != NULL) { 
     CFReadStreamSetProperty(m_tcpReadStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); 
     } 
    } 
    } 

當我按下home鍵這完美的作品。我的ping是從服務器接收到的,當我喚醒我的應用程序時,所有消息都已收到。 我的問題是當我使用電源按鈕鎖定iPhone屏幕。套接字實際上是關閉的。我的服務器收到一個SIGPIPE錯誤,當我喚醒電話時,read()函數會說:「套接字未連接」。

我認爲有一個背景套接字是非常愚蠢的,如果這是關閉時,用戶鎖定屏幕(默認情況下,這種情況發生在1或5分鐘之間),所以也許我以錯誤的方式做事情。

有沒有人設法克服這個問題? 使用iphone 3GS測試iOS 5.0時& iphone 4

+0

您是否按照@DarkDust的建議嘗試'setKeepAliveTimeout:handler:'? 也許在'applicationWillResignActive:'中有一些準備工作? – Thompsonian 2012-05-02 13:58:51

回答