我在应用程序中使用Firebase。我想在数据库中记录用户的状态,它当前是否在应用程序中。我使用官方文档中的代码,该代码必须确保此任务。打开应用程序时,该值设置为NO,然后更改为YES。但是在应用程序结束时以及向后台的转换时,不会调用块,并且值不会更改。这是我的代码......
FIRDatabaseReference *connectedRef = [[FIRDatabase database] referenceWithPath:@".info/connected"];
[connectedRef observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {
if([snapshot.value boolValue]) {
NSLog(@"CONNECTED");
} else {
NSLog(@"NOT CONNECTED");
}
}];
2017-01-17 13:36:38.203 Tricker [6293:817528]未连接
2017-01-17 13:36:40.863 Tricker [6293:817528]已连接
控制台提供以下信息,显示应用程序打开后两秒后值变为NO,表示NO。但是当应用程序关闭时没有任何反应......
提示可能出现什么问题?
答案 0 :(得分:1)
您似乎混淆了连接状态和应用程序生命周期。
当它处于活动状态时,Firebase数据库客户端将在.info/connected
路径上触发有关其连接状态的信息。
但是当应用程序未激活时,客户端无法再发送此信息。您需要使用常规iOS application lifecycle events来检测应用何时变为无效状态。
Recording the user's presence in the database分为两个步骤:
第2步由onDisconnectSetValue
:
[presenceRef onDisconnectSetValue:@"I disconnected!"];
诀窍在于,您通常会在应用程序启动时尽早调用此方法。当Firebase数据库服务器检测到客户端断开连接时,将执行写入操作。
这种脱节可以通过两种方式实现:
当您的应用崩溃时,您处于情境2中。在这种情况下,服务器检测到客户端消失可能需要几分钟,因为您正在等待套接字超时
答案 1 :(得分:0)
你关闭应用意味着什么?两件事可能性
(void)applicationDidEnterBackground:(UIApplication *)application {
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@" YOUR_KEY"]; [[NSUserDefaults standardUserDefaults] 同步];
}
(void)applicationWillTerminate:(UIApplication *)application {
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"YOUR_KEY"];
[[NSUserDefaults standardUserDefaults] synchronize];
}