在我制作的 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!
将此状态更改为相应的 false
或 true
/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/