服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - 解决webview内的iframe中的事件不可用的问题

解决webview内的iframe中的事件不可用的问题

2022-12-02 16:02GIS开发者 Android

这篇文章主要介绍了解决webview内的iframe中的事件不可用的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

最近做Android的Webview开发,使用iframe中嵌入了很多页面,嵌入的页面却不可用,最后发现是

?
1
2
3
4
5
webView.setWebViewClient(new WebViewClient() {
  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
   return super.shouldOverrideUrlLoading(view, url);
  }

不要覆写

shouldOverrideUrlLoading

这个方法,覆写这个方法会拦截ifame中的事件。

补充知识:Android 原生WebView访问使用iFrame网页问题(页面找不到了)

问题:

项目使用原生WebView访问使用了iFrame的网页出现的问题,列表页使用iFrame跳转到淘宝客的地址,单独访问淘宝客地址是能够打开。但列表页跳转过去总是提示“页面找不到了”,尝试很多方法,最终发现是WebView对第三方Cookie支持的问题。

解决:

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true);

完整配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
mWebView.setWebViewClient(new WebViewClient() {
  @Override
  public void onPageStarted(WebView view, String url, Bitmap favicon) {
   super.onPageStarted(view, url, favicon);
  }
 
  @Override
  public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
   handler.proceed();
   super.onReceivedSslError(view, handler, error);
  }
 
  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) { return super.shouldOverrideUrlLoading(view, url);
  }
 
  @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  @Override
  public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
   return super.shouldInterceptRequest(view, request);
  }
 
  @Override
  public void onPageFinished(WebView view, String url) {
   super.onPageFinished(view, url);
   if (null != title && null != view && TextUtils.isEmpty(mTitle))
    title.setText(view.getTitle());
  }
 });
 mWebView.setWebChromeClient(new WebChromeClient() {
         @Override
         public void onProgressChanged(WebView webView, int i) {
          super.onProgressChanged(webView, i);
         }
 
         @Override
         public boolean onJsConfirm(WebView view, String url, String message, android.webkit.JsResult result) {
          return super.onJsConfirm(view, url, message, result);
         }
 
         @Override
         public void onShowCustomView(View view, CustomViewCallback callback) {
          super.onShowCustomView(view, callback);
         }
 
         @Override
         public void onHideCustomView() {
         }
 
         @Override
         public boolean onShowFileChooser(WebView webView, android.webkit.ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
          return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
         }
 
         @Override
         public boolean onJsAlert(WebView view, String url, String message, android.webkit.JsResult result) {
          return super.onJsAlert(view, url, message, result);
         }
 
         @Override
         public void onReceivedTitle(WebView view, String title) {
          super.onReceivedTitle(view, title);
         }
        }
 
 );
 
WebSettings mWebSettings = mWebView.getSettings();
 
 mWebSettings.setAllowFileAccess(true);
 mWebSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
 mWebSettings.setSupportZoom(true);
 mWebSettings.setBuiltInZoomControls(true);
 mWebSettings.setUseWideViewPort(true);
 mWebSettings.setSupportMultipleWindows(false);
 mWebSettings.setAppCacheEnabled(true);
 mWebSettings.setDomStorageEnabled(true);
 mWebSettings.setJavaScriptEnabled(true);
 mWebSettings.setGeolocationEnabled(true);
 mWebSettings.setAppCacheMaxSize(Long.MAX_VALUE);
 mWebSettings.setAppCachePath(getDir("appcache", 0).getPath());
 mWebSettings.setDatabasePath(getDir("databases", 0).getPath());
 mWebSettings.setGeolocationDatabasePath(getDir("geolocation", 0)
   .getPath());
 mWebSettings.setPluginState(WebSettings.PluginState.ON_DEMAND);
 mWebSettings.setLoadWithOverviewMode(true);
 mWebSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
 String mUserAgent = mWebSettings.getUserAgentString();
 mWebSettings.setUserAgentString(mUserAgent + " App/AppName");
 syncCookie();
 mWebSettings.setUseWideViewPort(true);
 mWebSettings.setLoadWithOverviewMode(true);
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  mWebSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
 } else {
  mWebSettings.setCacheMode(WebSettings.LOAD_DEFAULT);
 }
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
  mWebSettings.setDisplayZoomControls(false);
 }
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  mWebSettings.setLoadsImagesAutomatically(true);
 } else {
  mWebSettings.setLoadsImagesAutomatically(false);
 }
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  mWebSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
 }
 if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
  CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true);
 
 mWebView.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);
 mWebView.setHorizontalScrollBarEnabled(false);
 mWebView.setHorizontalFadingEdgeEnabled(false);
 mWebView.setVerticalFadingEdgeEnabled(false);
 
 mWebView.requestFocus();
private void syncCookie() {
 CookieSyncManager.createInstance(this);
 CookieManager cookieManager = CookieManager.getInstance();
 cookieManager.setAcceptCookie(true);
 CookieSyncManager.getInstance().sync();
}

以上这篇解决webview内的iframe中的事件不可用的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/GISuuser/article/details/78250492

延伸 · 阅读

精彩推荐