2011-11-01 58 views
2

我有一個AsyncSocket的實例,我一直使用它作爲iPad上的服務器,然後是另一個充當客戶端的iPad上運行的AsyncSocket套接字。我有所有必要的代碼在客戶端和服務器之間交換數據 - 這裏沒有問題。CocoaAsyncSocket在後臺無法工作

我遇到的問題是,這一切工作正常,但我的應用程序的漏洞在測試過程中,我注意到一個特別奇怪(和刺激性的問題):

如果我關閉服務器的iPad(在沒有任何一個套接字的委託在服務器上被觸發),然後客戶端斷開連接(並進入一個我不斷重試的循環)。令人討厭的是,即使服務器重新啓動,客戶端仍然無法連接到它。事實上,即使我從頭開始重新啓動客戶端,它仍然無法連接到服務器。我必須重新啓動服務器應用程序才能讓客戶端再次連接。

奇怪的是,只有當服務器從頂部的按鈕切換到「關閉」(即進入待機狀態)時,纔會觸發此錯誤。如果我只是使用主頁按鈕將應用程序發送到後臺,則客戶端仍然保持與服務器的連接:只有當設備斷開連接時,客戶端纔會收到斷開連接委託消息並斷開連接,然後拒絕重新連接。與此同時,服務器完全沒有意識到這一點,也沒有任何委託方法被解僱。

爲了推廣我的問題:

  • 當設備使用的按鈕的iPad的頂部置於待機到底發生了一個AsyncSocket服務器實例?
  • 爲什麼沒有委託方法被激發,但是所有連接的客戶端都被斷開連接?
  • 設備再次打開時會發生什麼?
  • 爲什麼客戶端無法重新連接?

回答

1

我設法找到一個解決這個問題,所以我會在這裏分享: -

在我的服務器類,我增加了以下內容:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil]; 

然後我說的以下方法使套接字重新開始偵聽:

- (void)applicationDidBecomeActive { 
    NSError *error; 
    if (![socket acceptOnPort:kPORT error:&error]) 
    { 
     // error code 
    } 
} 

當服務器進入黑色時,仍然無法阻止客戶端斷開連接因此我只是讓它們循環直到服務器再次可用,並且appEnteredForeground方法將確保服務器在iPad(或iPhone,我猜)再次打開後再次開始收聽。

+0

UIApplicationDidEnterBackgroundNotification - > UIApplicationDidBecomeActiveNotification – david

+0

appEnteredBackground - > applicationDidBecomeActive – david