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

标签 ios swift firebase firebase-realtime-database

在我制作的 iOS 应用程序中,如果另一个用户与 Firebase 数据库的连接断开,我希望一个用户立即知道。如果 onDisconnect 方法不是因为它不会立即触发,而是在几分钟后触发,它就会起作用。 API 中是否缺少任何东西,或者是否有一些聪明(而且不太困惑)的解决方法可以实现这一点?

这两个用户之间的持续沟通非常重要,因此如果对方失去沟通能力,立即知道这一点至关重要。

最佳答案

要检查用户是否已离线或在线访问您的 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,
         ....
         }
    

每当您的用户离线或在线时,只需通过检查 connected! 将此状态更改为相应的 falsetrue/strong> 在上面的代码块中。您很可能必须考虑应用程序进入后台终止 等的可能性,它们的调用 block 通常出现在 AppDelegate 中 例如 func applicationWillResignActive(_:, func applicationDidEnterBackground(_ 。只是浏览文档

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

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

    FIRDatabase.database().reference().child("online_Users").onDisconnectUpdateChildValues([FIRAuth.auth()!.currentUser!.uid : false], withCompletionBlock: {(Err, Ref) in
    
    
        print(Ref)
        print(Err?.localizedDescription)
    
    
    })
    

另见:- Firebase Documentation For offline capabilities

PS:- 从数学上讲,对于这种特定情况,可以有四种可能的组合。任何用户状态要么是true,要么是false,所以从数学上讲它是(2C1)*(2C1) = 4。但我认为你明白了。要使您的应用万无一失,您需要满足所有这四种组合。

关于ios - 在客户端之间传递连接状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40435499/

相关文章:

iOS 至少在 10.3 之前缺少 URLRequest 中的 POST 数据

ios - 自定义 UIStoryboardSegue 和 UIViewController 转换之间的区别

ios - 如何在 View Controller 之间滑动?

arrays - 如何从 FireBase 访问嵌套的 NSDictionary 数据

ios - 为什么我的 Print 语句没有被执行?

json - 仅在一个级别创建一个随 secret 钥

ios - 为 NSMutableArray 中的对象分配数值

ios - 为显示错误图像的 MKMapView 设置 annotationView 图像

cocoa-touch - Swift 的内置函数列表在哪里?

ios - DateFormatter 不返回 "HH:mm:ss"的日期