【问题标题】:When you close the application, boolean not set to no关闭应用程序时,布尔值未设置为 no
【发布时间】:2017-01-17 22:44:29
【问题描述】:

我在应用程序中使用 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 骗子[6293:817528] 未连接

2017-01-17 13:36:40.863 骗子[6293:817528] 已连接

控制台出现如下信息,显示应用开启后两秒后数值变化,从NO变为YES。但是当应用程序关闭时没有任何反应......

提示可能是什么问题?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    第二步由onDisconnectSetValue完成:

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

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

    这种断开可以通过两种方式发生:

    1. 当客户端显式关闭连接时
    2. 当服务器用来与客户端通信的套接字超时时

    当您的应用崩溃时,您处于情况 2。在这种情况下,服务器可能需要几分钟才能检测到客户端已消失,因为您正在等待套接字超时。

    【讨论】:

    • 感谢您的回复
    【解决方案2】:

    你关闭应用程序是什么意思?两件事的可能性

    1. 用户可以将应用置于后台: 在这里您可以设置一个 NSUSEDefault 值,例如:
    • (void)applicationDidEnterBackground:(UIApplication *)application {

      [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"YOUR_KEY"]; [[NSUserDefaults 标准用户默认值] 同步];

      }

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

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

      [[NSUserDefaults standardUserDefaults] 同步];

      }

    【讨论】:

    • 感谢您的回答!我知道如何操作这些功能,并尝试使用它们。但是,不幸的是,当一个应用程序崩溃时,该值不会改变,其他用户会看到该用户在线
    • @SashaTsvigun 您的应用程序不应崩溃。如果它崩溃了,你的代码就会停止。
    • Hay @SashaTsvigun 这段代码没有任何东西让你的应用崩溃。你在一些不同的位置崩溃。尝试纠正这些发生的位置或粘贴代码究竟是什么导致崩溃。
    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    相关资源
    最近更新 更多