我在使用webview
登录流程。如果用户只是在最初打开的页面上输入他的信息,一切都会正常工作。我收到了对 onPageFinished 的回调,我从 URL 中提取了一个令牌并从那里继续。但是,如果在最初打开的页面上,用户单击以使用 facebook 登录,那么他们将被重定向到 facebook 的登录页面,我似乎什至在 onPageFinished 中收到了该 URL 加载的回调。但是,如果用户以这种方式导航到 FB,那么我在 onPageFinished 中执行的其他异步调用将不会执行。如果他们只是立即输入他们的登录凭据,那么一切都很好。使用 FB,一切都会停止。没有相关日志,没有任何类型的崩溃。以下内容让您了解这一切的样子(我知道以下内容甚至不是有效的 Java 并且不会编译,但我
SomeAwesomeName extends Fragment {
View onCreateView {
Webview webView = new WebView;
webview.setWebViewClient(new MyClient)
return webiew;
}
class MyClient extends WebViewClient {
onPageFinished(String url) {
if(url.contains("/user/login/done")) { //user hit login on the initially opened page and we're good
//grab a token from that url and do some asynchronous call
SomeClass.fetchSomethingAsync("what to fetch", new CallBack() {
void done(data) {
startActivity(new Intent("bla bla"))
getActivity.finish
}
})
}
}
}
}
我意识到上面的内容可能有点令人困惑,所以让我将问题总结如下:在所有情况下,当我们被定向到包含“user/login/done”的 URL 时,登录流程就会结束。无论用户选择使用他们的电子邮件/密码还是决定使用 facebook,登录流程总是在同一个地方结束。
流程只能是以下两种可能性之一:
第一种可能性(这可行) 片段变得可见-> WebView加载URL->用户使用电子邮件/密码登录->调用onPageFinished->提取令牌->在onPageFinished内部触发异步调用并在回调时启动一个新活动叫。
第二种可能性 片段变得可见-> WebView加载URL->用户单击以使用重定向到FB的FaceBook登录->调用onPageFinished->提取令牌->然后...什么也没有。
这里唯一的区别是用户在网页方面导航更深一层。除此之外,我无法弄清楚到底发生了什么。在 FB 登录成功后实际上调用 onPageFinished 的事实让我更加陌生。onPageFinished 被调用,我可以从传递给我的 URL 中获取令牌,但随后 onPageFinished 就像停止执行一样。该应用程序没有遇到 ANR 或崩溃,并且日志中没有任何可疑之处。
编辑
实际上,我现在看到在 onPageStarted 中传递给我的 URL 之一包含:
Ferror_reason%3Duser_denied%26error%3Daccess_denied%26error_description%3DThe%2Buser%2Bdenied%2Byour%2Brequest
所以 webview/webviewclient 发生了一些奇怪的事情。有什么想法吗?
编辑
即使出现 FB“用户拒绝访问”错误,我连接到与 FB 接口以处理登录的 Web 服务实际上也能够检索 FB 的令牌。在日志中,我看到 FB 错误,然后重定向回 web 服务到 user/login/done?token=FACEBOOK_TOKEN_HERE。
但是我似乎仍然无法在我的 onPageFinished 内部继续执行以启动一个新的活动。我什至尝试过在新线程中做所有事情或将可运行的内容发布到 getActivity().runOnUiThread,但似乎都没有帮助。