2016-03-20 11 views
0

Firebase iOS SDKを使用しています。私のアプリ体験の一部はグループチャットです。私は、各グループチャットのためのクラスを持っているし、次のようにfirebaseオブジェクトへの参照を格納します。Firebase iOSがJWTで再認証した後でイベントを受信しない

self.firebaseMessages = [[Firebase alloc] initWithUrl:[NSString stringWithFormat:@"%@/Message/%@", FIREBASE_URL, chat.objectId]]; 

私はその後、私が興味各イベントを観察し、これは非常にうまく機能します。 JWTでカスタム認証を使用しています。私の問題は、トークンが期限切れになるか、ユーザーがログアウトして再認証したときです。その時点で、アプリケーションを完全に再起動しない限り、私が観察しているイベントのコールバックは停止します。 AuthEventWithBlockで成功のコールバックとauthdataを取得したので、再認証が成功したことがわかります。値を設定すると、データベースの更新と他のクライアントは更新を受け取ります。それは、もはや更新を受け取らない再認証されたクライアントだけです。

私は可能性としてそれを排除するために、私のセキュリティルールをダウン易しく書き直さました:私は上で再認証を試してみた

Firebase *ref = [[Firebase alloc] initWithUrl:FIREBASE_URL]; 
    [ref authWithCustomToken:responseObject[@"auth_token"] withCompletionBlock:^(NSError *error, FAuthData *authData) { 

:ルートURLに私は再認証

"Message": { 
     "$message": { 
     ".read": "auth != null", 
     ".write": "auth != null" 
     } 
    } 

各メッセージのURL Firebaseオブジェクトのすべてを再インスタンス化しようとしました。

また、ユーザーをログアウトしてトークンの有効期限をシミュレートするために、ルートで[ref unauth]を使用しています。

私には何が欠けていますか?

+0

私はあなたのリスナーが認証の喪失後にキャンセルされていると思います(このような短い量のコードでこれを確認することは不可能です)。これを確認するには、キャンセルブロックを追加し、発生したキャンセルエラーをログに記録します。再認証後にリスナーを再確立する必要があります。 – Kato

+0

認証が失われたときにリスナーがキャンセルされた場合は、意味があります。私はそれを認識しませんでした。 Firebaseオブジェクトを再インスタンス化すると、明らかに離れてしまうので、それは私の上のサイトです。私はリスナーを再構築して問題を解決できると確信しているので、私はそれを撃つだろう。ありがとう。 – Londo

答えて

0

加藤さんのコメントが解決です。 認証と再認証を失った場合は、必ずイベントリスナーを再確立してください。

また、リスナーが再確立されたときに、すべてのデータが再び返されることはありません。グループチャットのようなリスナーからのデータをストリームする画面上にいる場合は、すでに表示されているデータを受け取る可能性が高くなります。しかし、扱いやすいほど簡単です。

関連する問題