2017-03-15 104 views
1

我使用了一個導致應用程序崩潰的小錯誤。查詢來自Firebase的數據時很可能發生錯誤(是的,是我的錯)。這是當應用程序啓動將要執行的第一個函數:爲什麼當應用程序崩潰時,Firebase不支持onDisconnect?

let currentUser = FIRAuth.auth()?.currentUser?.uid 
      let con = self.gameRef!.childByAutoId() 
      self.usersKey = con.key 
      let values = ["username": "test", "score": 0, "userID": currentUser!] as [String : Any] 
      con.updateChildValues(values) 
      con.onDisconnectRemoveValue() 

那麼這個設置後,我查詢例如從火力地堡一個數組,但我並設置一些值錯什麼導致應用程序崩潰。 onDisconnected函數從不執行。我等了一整天,我的信息仍然顯示在實時數據庫中。如果此代碼在服務器端執行,那麼服務器如何仍然認爲我已連接?打開飛行模式關閉應用&將正確斷開我的連接。

+0

耐心在這裏是一種美德。當應用程序崩潰時,Firebase客戶端沒有時間明確指示斷開連接。你的'onDisconnect()'處理程序仍然會觸發,但是它需要幾分鐘的時間(套接字超時)。請參閱http://stackoverflow.com/questions/30668292/firebase-when-ondisconnect-event-fire/30670928#30670928 –

+0

我應該耐心等待多久?我已經在我的問題中說過,我等了一整天,相信我是24小時,而且還沒有消失。 –

+0

正如我在回答中所說的那樣,可能需要幾分鐘的時間。長於此,更可能是其他事情出錯了。另外請記住,在您的示例中,重新啓動應用程序將重寫相同的值。 –

回答

0

發生這種情況是因爲您的應用沒有正確關閉。爲了讓該功能啓動,它必須在應用程序關閉並清理其所有連接時啓動。它崩潰時無法執行此操作,因爲它不會執行比以前更多的代碼。

你可以在代碼的那一部分包裝一個異常處理程序,然後執行你所需要的異常。

+1

* *實際上是一種方式。但這取決於服務器*檢測*斷開連接,這需要一些時間。看到我鏈接的答案。 –

+0

@FrankvanPuffelen謝謝我不知道這是一件事情。 –

+0

由於服務器上的功能繼電器,服務器應檢查連接。當我打開飛行模式時,它會正確處理斷開連接。不是當應用程序崩潰。 –

相關問題