【问题标题】:Why does Firebase not support onDisconnect when app crashes?为什么应用崩溃时 Firebase 不支持 onDisconnect?
【发布时间】:2017-03-15 20:29:15
【问题描述】:

我习惯了我有一个小错误导致应用程序崩溃。从 Firebase 查询数据时最有可能出现该错误(是的,是我的错)。这是应用启动时将执行的第一个函数:

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()

然后在设置之后,我从 Firebase 查询例如一个数组,但我确实设置了一些错误的值,这会导致应用程序崩溃。 onDisconnected 函数永远不会执行。我等了一整天,我的信息仍然显示在实时数据库中。如果这段代码是在服务器端执行的,那服务器怎么还认为我连接了呢?关闭应用程序并打开飞行模式将正确断开我的连接。

【问题讨论】:

  • 耐心在这里是一种美德。当应用崩溃时,Firebase 客户端没有时间明确发出断开连接的信号。您的 onDisconnect() 处理程序仍将触发,但需要几分钟(套接字超时的时间)。见stackoverflow.com/questions/30668292/…
  • 我应该耐心多久?我已经在我的问题中说我等了一整天,相信我是 24 小时,它仍然没有消失。
  • 正如我在链接的答案中所说,可能需要几分钟。比这更长的时间更有可能出现其他问题。另请记住,在您的示例中,重新启动应用程序将重写相同的值。
  • 是的,好吧,我想知道还有什么问题。即使应用程序一天没有运行,Firebase 也永远不会看到我断开连接...重新启动应用程序实际上会在我的 gameRef 中创建另一个孩子,我有超过 40 个孩子都具有相同的 UID,因为 Firebase 不会断开我的连接,而不是几分钟内,而不是几小时内,我想几天内都不会。如果此功能应在服务器上运行,则它在应用程序崩溃时不起作用。嗯,明天删除的时候我会通知你的。
  • 嗯....我想我能够重现这种行为。我正试图弄清楚那里发生了什么。

标签: swift firebase firebase-realtime-database


【解决方案1】:

发生这种情况是因为您的应用未正常关闭。为了触发该功能,它必须在应用程序关闭并清理其所有连接时触发。当它崩溃时它没有办法这样做,因为它不会执行比它已经执行的更多的代码。

您可以围绕该部分代码包装一个异常处理程序,然后对该异常执行您需要的操作。

【讨论】:

  • 其实有的方法。但这取决于服务器检测断开连接,这需要一些时间。请参阅我链接的答案。
  • @FrankvanPuffelen 谢谢,我不知道这是一回事。
  • 由于该功能在服务器上中继,服务器应检查连接。当我打开飞行模式时,它会正确处理断开连接。不是在应用崩溃时。
猜你喜欢
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
相关资源
最近更新 更多