在客户端之间传递连接状态

时间:2016-11-05 06:37:47

标签: ios swift firebase firebase-realtime-database

在我正在制作的iOS应用中,我希望一位用户立即知道其他用户是否失去了与Firebase数据库的连接。 onDisconnect方法如果不是因为它不会立即触发,而是在几分钟后触发,则会起作用。 API中是否有任何遗漏,或者可能是一些可以实现此目的的聪明(而不是太乱)的解决方法?

这两个用户之间的持续沟通非常重要,因此关键是要立即知道对方是否已失去沟通能力。

1 个答案:

答案 0 :(得分:1)

要检查用户是否已离线或在线访问您的Firebase数据库,您可以: -

FIRDatabase.database().reference().child(".info/connected").observe(.value,with : {(Snap) in 

  let connected = Snap.value as? Bool 
  print(connected!)  


})

.observe(.value, with : ... 会打开一个单独的网络线程,只要用户的状态发生变化就会被调用。

有两种可能性: -

  • 用户故意关闭该应用。

    只需将其添加到您的数据结构中: -

      online_Users: {
    
        userID1 : true,
        userID2 : false,  // user 2 went offline
        userID3 : true,
        userID4 : true,
         ....
         }
    

每当您的用户离线或在线时,只需通过检查上述代码块中的 false ,将此状态更改为相应的trueconnected!。最有可能的是你必须考虑应用进入背景终止等的可能性,其调用块通常出现在 {{1}中,例如 AppDelegate func applicationWillResignActive(_: 。只需浏览文档

即可

然后在您的user1应用中检索您的user2活动状态,然后就可以了。实际上,从user1应用程序中收听 childChanged 以获取user2状态,以便每次更改时都会触发它。

  • 用户丢失其网络连接,正如@Frank在评论中所建议的那样: -

    func applicationDidEnterBackground(_

另见: - Firebase Documentation For offline capabilities

PS: - 数学上可能有四种可能的 组合 来应对这种特殊情况。任何用户状态都是FIRDatabase.database().reference().child("online_Users").onDisconnectUpdateChildValues([FIRAuth.auth()!.currentUser!.uid : false], withCompletionBlock: {(Err, Ref) in print(Ref) print(Err?.localizedDescription) }) true所以mahtematicaly说它的(2C1)*(2C1)= 4.但我认为你得到了这个jist。为了使您的应用程序万无一失,您需要满足所有这四种组合。