【发布时间】:2016-03-20 16:31:32
【问题描述】:
我正在使用 Firebase iOS SDK,我的部分应用体验是群聊。我为每个群聊设置了一个类,并存储了对 firebase 对象的引用,如下所示:
self.firebaseMessages = [[Firebase alloc] initWithUrl:[NSString stringWithFormat:@"%@/Message/%@", FIREBASE_URL, chat.objectId]];
然后我观察我感兴趣的每个事件。这非常有效。我将自定义身份验证与 JWT 一起使用,我的问题是令牌过期或用户注销/登录并重新身份验证时。那时,除非我完全重新启动我的应用程序,否则回调会停止为我正在观察的事件触发。我知道重新验证成功,因为我在 AuthEventWithBlock 中获得了成功回调和 authdata。当我设置值时,数据库更新和其他客户端接收这些更新。只是重新授权的客户端不再接收更新。
我已经简化了我的安全规则以消除这种可能性:
"Message": {
"$message": {
".read": "auth != null",
".write": "auth != null"
}
}
我在根 URL 上重新验证:
Firebase *ref = [[Firebase alloc] initWithUrl:FIREBASE_URL];
[ref authWithCustomToken:responseObject[@"auth_token"] withCompletionBlock:^(NSError *error, FAuthData *authData) {
我也尝试过对每个消息 URL 进行重新验证。还尝试重新实例化我的所有 Firebase 对象。
另外请注意,我在根目录上使用 [ref unauth] 来注销用户并模拟令牌过期。
我错过了什么?
【问题讨论】:
-
我想您的听众在失去身份验证后被取消(不可能用如此简洁的代码来验证这一点)。您可以通过添加取消块并记录发生的取消错误来验证这一点。重新认证后需要重新建立监听器。
-
如果侦听器因失去身份验证而被取消,这是有道理的。我没有意识到这一点。显然,如果我重新实例化 Firebase 对象,它们无论如何都会消失 - 所以这对我来说是一个过度的网站。我确信重新建立听众会解决问题,所以我会试一试。谢谢。