2017-01-17 6 views
0

私はアプリケーションでFirebaseを使用します。私はデータベースにユーザのステータスを記録したい、現在アプリケーションに入っているかどうか。公式文書のコードを使用します。これはこの作業を確実にする必要があります。アプリケーションがオープンされると、値はNOに設定され、YESに変更されます。しかし、アプリケーションの終了とバックグラウンドへの移行では、ブロックは呼び出されず、値は変更されません。 36::ここに私のコードは...アプリケーションを終了すると、ブール値がnoに設定されない

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年1月17日13である38.203トリッカー[6293:817528]

2017年1月17日13接続されていません:36:40.863トリッカー[ 6293:817528] CONNECTED

コンソールには、次の情報が表示されます。この情報は、アプリケーションが開かれてから2秒後にNOがYESに変わることを示しています。しかし、アプリケーションが閉じられても何も起こりません...

何か問題が発生する可能性がありますか?

答えて

0

あなたはアプリの手段を閉じるのですか?二つの可能性バックグラウンドでアプリを置くことができる

  1. ユーザー:
  • (ボイド)applicationDidEnterBackground:(のUIApplication *)アプリケーション{

    は、ここでは、のようなNSUSEDefault値を設定することができます

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

    }

背景からアプリを削除することができ
  • ユーザー:
    • (ボイド)applicationWillTerminate:(のUIApplication *)アプリケーション{

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

      [[NSUserDefaults standardUserDefaults] synchronize];

      }

    +1

    ありがとうございます!私はこれらの機能の操作方法を知り、それらを使用しようとしました。しかし、残念ながら、アプリケーションがクラッシュした場合、値は変更されず、他のユーザーはこのユーザーがオンラインであることがわかります –

    +1

    @SashaTsvigunアプリケーションはクラッシュしません。クラッシュした場合、コードは停止します。 –

    +0

    Hay @SashaTsvigunこのコードにはアプリケーションがクラッシュするようなものはありません。あなたは別のポジションで墜落します。これらが起こっている場所を修正するか、コードを貼り付けて正確にクラッシュさせるようにしてください。 –

    1

    あなたは、接続状態やアプリケーションのライフサイクルを混乱しているようです。

    アクティブになると、Firebaseデータベースクライアントは、接続状態に関する情報を.info/connectedパスで起動します。

    しかし、このアプリがアクティブでない場合、クライアントはこの情報をもう処理できません。アプリが非アクティブになったときを検出するには、通常のiOS application lifecycle eventsを使用する必要があります。2段階のプロセスとして

    Recording the user's presence in the database作品:

    1. アプリケーションは、ユーザーがアプリケーションがを開始するとき、あなたが言うオンライン
    2. であることを知らせるために、データベースに値を書き込む開始したときユーザーが行ったことを通知する別の値をデータベースに書き込むことができます。

    ステップ2はonDisconnectSetValueすることによって達成される:

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

    トリックはあなたのアプリケーションの起動時に、通常、早期にこのメソッドを呼び出すことです。ファイアウォールデータベースサーバがクライアントの切断を検出すると、書き込み操作が実行されます。クライアントが明示的に

  • たときに、サーバーが
  • ときにクライアントがタイムアウトと通信するために使用するソケット接続が閉じられたとき

    1. この切断は、2つの方法で発生する可能性がありますあなたのアプリがクラッシュすると、状況2になります。その場合、ソケットがタイムアウトするのを待っているので、サーバがクライアントがなくなったことを検出するまでに数分かかることがあります。

    +0

    ご返信ありがとうございます –

    関連する問題