一些应用程序如何能够在 android webview 中成功执行谷歌登录?

Nik*_*hil 5 android webview google-login

如此处所述谷歌已停止支持webview. 但是 Play 商店中的应用程序(多合一应用程序)正在使用他们的应用程序中显示多个渐进式应用程序webview,我们可以使用谷歌登录登录那里。

所以我的问题是我们如何才能做到这一点。

我已经通过以下查询搜索了有关 SO 的问题。

Android 403:错误:不允许的用户代理

找到了很多公认的答案,其中一些包含各种 UserAgentString

尝试了所有这些,但没有一个有帮助。因为UserAgentString并不总是有帮助。

如果通过打开新窗口进行登录,则它不起作用。尽管我们定义相同UserAgentStringwebviewonCreateWindow的回调WebChromeClient

我也试过寻找webview类似CrossView 等的替代品,但它们在过去 3 年中没有得到维护。
我无法使用,custom chrome tabs因为我无法隐藏custom chrome tab.

因此,请建议我是否真的有可能,webview或者是否有任何替代方案webview

编辑- 到目前为止我尝试过的。

onCreate() 中的 WebView 初始化

webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setSupportMultipleWindows(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.getSettings().setUserAgentString("Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36");
webView.getSettings().setGeolocationEnabled(true);
webView.getSettings().setUseWideViewPort(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setAllowContentAccess(true);
webView.getSettings().setDatabaseEnabled(true);
webView.getSettings().setLoadsImagesAutomatically(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
webView.setWebChromeClient(new MyWebChromeClient());
enableHTML5AppCache(webView);

webView.loadUrl("https://www.makemytrip.com/");
Run Code Online (Sandbox Code Playgroud)

支持方法和类

private void enableHTML5AppCache(WebView mWebView) {

    mWebView.getSettings().setDomStorageEnabled(true);

    // Set cache size to 8 mb by default. should be more than enough
    mWebView.getSettings().setAppCacheMaxSize(1024 * 1024 * 8);

    // This next one is crazy. It's the DEFAULT location for your app's cache
    // But it didn't work for me without this line
    mWebView.getSettings().setAppCachePath("/data/data/" + getActivity().getPackageName() + "/cache");
    mWebView.getSettings().setAllowFileAccess(true);
    mWebView.getSettings().setAppCacheEnabled(true);

    mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
}

private class MyWebChromeClient extends WebChromeClient {

    @Override
    public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, android.os.Message resultMsg) {
        WebView newWebView = new WebView(getActivity());

        newWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        newWebView.getSettings().setUserAgentString("Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36");
        newWebView.getSettings().setLoadWithOverviewMode(true);
        newWebView.getSettings().setAllowContentAccess(true);
        newWebView.getSettings().setDatabaseEnabled(true);
        newWebView.getSettings().setLoadsImagesAutomatically(true);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            newWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
        enableHTML5AppCache(newWebView);
        newWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onCloseWindow(WebView window) {
                webView.removeView(window);
            }
        });
        view.addView(newWebView);
        WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
        transport.setWebView(newWebView);
        resultMsg.sendToTarget();
        return true;
    }

    @Override
    public void onCloseWindow(WebView window) {
        webView.removeView(window);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我使用上面的UserAgentStringgoogle 登录时,它在相同的webView. 但是在上面的站点中,当您单击login->google它时,它会请求新窗口(我在上面有新窗口的返回代码 - 请参阅onCreateWindow()上面的方法)然后显示error 403 - Disallowed UserAgent.

小智 14

webSettings.setUserAgentString(webSettings.getUserAgentString().replace("; wv",""));

然后你就可以登录了。


小智 4

你的代码看起来是正确的。

Google OAuth 根据用户代理字符串阻止 WebView,使用您自己的用户代理字符串可以再次登录(实际上您只需要从原始字符串中删除“wv”)。

不幸的是,WebView 中存在一个错误,即setSupportMultipleWindows启用该选项后,新创建的 WebView 中的第一个导航将使用默认的用户代理字符串。有关更多详细信息,请参阅错误跟踪器:https://bugs.chromium.org/p/chromium/issues/detail ?id=614951

该错误在 Chromium 67 中得到修复(当前版本为 66),因此下一版本的 WebView 预计可以正常工作。不过我自己还没有测试过。

因此,要么禁用多窗口支持,要么等待下一个版本的 WebView 到达用户(如果您确实需要解决方法,您可以尝试在第一次导航后重新加载页面或类似的操作)。