【发布时间】:2014-06-14 18:34:32
【问题描述】:
我正在使用 Firebase 简单登录,它接受正确的登录,拒绝不正确的登录,然后悄悄地让我退出(不知道它是否有效)。我正在努力解决的是:当我的应用程序启动时,我需要确定用户是否仍然登录(如果他们选择“记住我”,就会发生这种情况)。如果是这样,我会继续前进,否则我会显示一个登录屏幕。
我观察到的是,如果我在整个 Firebase 上调用 unauth 函数,然后尝试使用 check 方法,返回到块的错误是 NULL 并且用户电子邮件仍然与最后登录的用户。如果我在 auth 对象上使用 logout 方法,也会发生同样的情况。
这是一个 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),但用户信息完好无损。换句话说,我无法判断我的用户未经授权。
更新:在 Firebase 对象上调用 unauth 似乎不会影响 check 查看登录状态的方式。我对motion-firebase中的注销方法做了一个简单的修复,似乎在auth对象上调用logout方法实际上清除了该对象中的信息并在Firebase对象上调用unauth。这只是我从观察正在发生的事情中得出的结论。
需要注意的是,调用check(映射到(void)checkAuthStatusWithBlock:(void ( ^ ) ( NSError *error , FAUser *user ))block)是异步运行的,完成后调用块,出现nil错误和完全为空的用户。
nil 错误是预期的行为吗?
【问题讨论】:
标签: ios firebase firebasesimplelogin