我正在使用Firebase简单登录,它接受正确的登录,拒绝不正确的登录,并安静地让我退出(不知道它是否有效) . 我正在努力的是:当我的应用程序启动时,我需要弄清楚用户是否仍然登录(如果他们选择“记住我”,就会发生这种情况) . 如果是这样,我会一直向前移动,否则我会出现一个登录屏幕 .
我观察到的是,如果我在整个Firebase上调用 unauth
函数然后尝试使用 check
方法,则返回到块的错误为NULL,用户电子邮件仍然与上次登录用户相同 . 如果我在auth对象上使用 logout
方法,也会发生同样的情况 .
这是一个RubyMotion应用程序,所以我可以在REPL中使用它,看看发生了什么 .
更新:我正在添加代码,所以其他任何人都可以看到正在发生的事情 . 事实证明,这在运动火力基础上是一种特质 . 我将提交一份修正案 . 与此同时,这是我的代码:
设置代码:
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中的logout方法做了一个简单的修复,看来在auth对象上调用 logout
方法实际上清除了该对象中的信息,并在Firebase对象上调用 unauth
. 这只是我从观察正在发生的事情中扣除的 .
应该注意的是,调用 check
(映射到 (void)checkAuthStatusWithBlock:(void ( ^ ) ( NSError *error , FAUser *user ))block
)以异步方式运行,并在完成时调用该块,并出现 nil
错误和完全空的用户 .
nil
错误是预期的行为吗?
1 回答
随意发布您遇到问题的确切代码,以获得更准确的答案 .
Firebase使用回调来确定用户所处的状态 . 根据您用于FireBase的ruby包装器,实现可能会有所不同 . Firebase通常为您提供三个选项:成功(如果用户已经过身份验证或只是成功通过身份验证),错误(出错)和Else(用户未登录) . 在每个回调中,您都可以指定要执行的操作 .