在我正在制作的iOS应用中,我希望一位用户立即知道其他用户是否失去了与Firebase数据库的连接。 onDisconnect方法如果不是因为它不会立即触发,而是在几分钟后触发,则会起作用。 API中是否有任何遗漏,或者可能是一些可以实现此目的的聪明(而不是太乱)的解决方法?
这两个用户之间的持续沟通非常重要,因此关键是要立即知道对方是否已失去沟通能力。
答案 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
,将此状态更改为相应的true
或connected!
。最有可能的是你必须考虑应用进入背景,终止等的可能性,其调用块通常出现在 {{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。为了使您的应用程序万无一失,您需要满足所有这四种组合。