我正在使用 Firebase 简单登录,它接受正确的登录,拒绝不正确的登录,然后悄悄地让我注销(不知道它是否有效)。我正在努力解决的是:当我的应用程序启动时,我需要确定用户是否仍然登录(如果他们选择“记住我”,就会发生这种情况)。如果是这样,我会继续前进,否则我会显示一个登录屏幕。
我观察到的是,如果我unauth
在整个 Firebase 上调用该函数,然后尝试使用该check
方法,则返回到该块的错误为 NULL,并且用户电子邮件仍然与上次登录的用户相同。如果我logout
在 auth 对象上使用该方法,也会发生同样的情况。
这是一个 RubyMotion 应用程序,所以我可以在 REPL 中使用它,看看发生了什么。
更新:我正在添加代码,因此遇到此问题的其他任何人都可以看到发生了什么。事实证明,这在 motion-firebase 中是一种特质。我将为此提交修复程序。与此同时,这是我的代码:
设置的代码:
def init_firebase
@fire_ref = Firebase.new('https://my-fine-firebase.firebaseio.com')
@auth = FirebaseSimpleLogin.new(@fire_ref)
end
def login(email, password, &block)
status = MotionMap::Map.new({error: 'success', user: nil})
@auth.login(email: email, password: password) { |error, user|
status.user = user
if error.nil?
if user.nil?
status.error = "no error but user is nil"
end
block.call(status)
else
status.error = error.localizedDescription
block.call(status)
end
}
end
因此,调用我的登录方法会响应 Firebase 回调,并在完成时依次在我的 Ruby 代码中执行一个闭包。这一切都有效。这些MotionMap
东西只是一个很好的方法来获得无关访问的哈希值。
现在,在 REPL 中我可以这样做:
(main)> error = nil
(main)> f.unauth{|e| error = e}
(main)> p error
nil
(main)> error = user = nil;
(main)> a.check{|e, u| error = e; user = u}
(main)> p error
=> nil
(main)> puts user.email
=> 'my_real_email_address'
所以我做的第一件事就是取消对这个特定的 Firebase 引用的授权,对吧?然后,我继续检查。错误为 nil(Objective-C 中为 NULL),但用户信息完好无损。换句话说,我不能说我的用户是未经授权的。
更新:调用unauth
Firebase 对象似乎不会影响check
查看登录状态的方式。我对motion-firebase中的注销方法做了一个简单的修复,似乎logout
在auth对象上调用该方法实际上会清除该对象中的信息并调用unauth
Firebase对象。这只是我从观察正在发生的事情中推断出来的。
应该注意,调用check
(映射到(void)checkAuthStatusWithBlock:(void ( ^ ) ( NSError *error , FAUser *user ))block
)是异步运行的,完成后调用块,出现nil
错误和完全为空的用户。
错误是nil
预期的行为吗?