关闭应用程序时,boolean未设置为no

时间:2017-01-17 12:06:26

标签: ios objective-c firebase firebase-realtime-database

我在应用程序中使用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。但是当应用程序关闭时没有任何反应......

提示可能出现什么问题?

2 个答案:

答案 0 :(得分:1)

您似乎混淆了连接状态和应用程序生命周期。

当它处于活动状态时,Firebase数据库客户端将在.info/connected路径上触发有关其连接状态的信息。

但是当应用程序未激活时,客户端无法再发送此信息。您需要使用常规iOS application lifecycle events来检测应用何时变为无效状态。

Recording the user's presence in the database分为两个步骤:

  1. 当应用程序启动时,您向数据库写入一个值以表示用户在线
  2. 当应用程序启动时,您告诉数据库服务器将另一个值写入数据库,表明用户已离开。
  3. 第2步由onDisconnectSetValue

    完成
    [presenceRef onDisconnectSetValue:@"I disconnected!"];
    

    诀窍在于,您通常会在应用程序启动时尽早调用此方法。当Firebase数据库服务器检测到客户端断开连接时,将执行写入操作。

    这种脱节可以通过两种方式实现:

    1. 当客户端明确关闭连接时
    2. 当服务器用于与客户端通信的套接字超时时
    3. 当您的应用崩溃时,您处于情境2中。在这种情况下,服务器检测到客户端消失可能需要几分钟,因为您正在等待套接字超时

答案 1 :(得分:0)

你关闭应用意味着什么?两件事可能性

  1. 用户可以将应用程序放在后台: 在这里,您可以设置NSUSEDefault值,如:
  2.   
        
    • (void)applicationDidEnterBackground:(UIApplication *)application {

           

      [[NSUserDefaults standardUserDefaults] setBool:NO   forKey:@" YOUR_KEY"]; [[NSUserDefaults standardUserDefaults]   同步];

           

      }

    •   
    1. 用户可以从后台删除应用:
    2.   
          
      • (void)applicationWillTerminate:(UIApplication *)application {

           [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"YOUR_KEY"]; 
        
             

        [[NSUserDefaults standardUserDefaults] synchronize];

             

        }

      •