想了解如何在SwiftiOS中使webview不可点击的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于swiftuiwebview的相关问题,此外,我们还将为您介绍关于不可点击,因为使用si
想了解如何在 Swift iOS 中使 webview 不可点击的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于swiftui webview的相关问题,此外,我们还将为您介绍关于不可点击,因为使用signalr时它在实时同步内部会发生变化、Android Webview - 调用方法 webView.loadUrl 时,chromium 会显示 ANR(带有标题)、Android Webview -> 在 webview 的 localStorage 中设置值时未捕获的安全错误、android webview js 交互,响应 webview 图片的响应事件的新知识。
本文目录一览:- 如何在 Swift iOS 中使 webview 不可点击(swiftui webview)
- 不可点击,因为使用signalr时它在实时同步内部会发生变化
- Android Webview - 调用方法 webView.loadUrl 时,chromium 会显示 ANR(带有标题)
- Android Webview -> 在 webview 的 localStorage 中设置值时未捕获的安全错误
- android webview js 交互,响应 webview 图片的响应事件
如何在 Swift iOS 中使 webview 不可点击(swiftui webview)
如何解决如何在 Swift iOS 中使 webview 不可点击
我想在 Swift 中为 iOS 应用程序实现一个 webview,我只想在其中显示给定网站的内容。下面的实现有效,但我有 2 个我不知道如何实现的要求:
- 我希望用户无法以任何方式与显示的页面进行交互。因此,例如,如果有一个链接,用户就不能点击它。页面的任何其他元素(如图像等)也是如此。有没有办法做到这一点?在实践中,网站内容需要像内容图片一样提供,而不能与页面的各个元素进行交互。
- 我希望网站的地址永远不会对用户可见。在我下面的实现中,情况似乎是这样,但我不确定这是否在任何情况下都有效,以及是否有更安全的方法来确保永远不会向用户显示网址(即使例如 iOS 通知用户在加载页面时出现问题等)。
我在 ViewController.swift 中的内容如下:
import UIKit
import WebKit
class ViewController: UIViewController,WKNavigationDelegate {
var webView: WKWebView!
override func loadView() {
webView = WKWebView()
webView.navigationDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
let url = URL(string: "my-website-here")!
webView.load(URLRequest(url: url))
webView.allowsBackForwardNavigationGestures = true
}
}
解决方法
在 func override func viewDidLoad()
的右括号之后尝试实现这个
func webView(_ webView: WKWebView,decidePolicyFor navigationAction: WKNavigationAction,decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
decisionHandler(.cancel)
}
也在 webView.load(URLRequest(url: url))
下
添加
navigationController?.isToolbarHidden = true
navigationController?.isNavigationBarHidden = true
不可点击,因为使用signalr时它在实时同步内部会发生变化
如何解决<a href>不可点击,因为使用signalr时它在实时同步内部会发生变化
我使用signalr开发通知,过程运行良好,但单击不可点击但如果单击更多时间,它将打开url,因为它在实时更新(signalr)中 显示通知的代码:
const circleXForY = (y,r) => (1 - (y / r) ** 2) ** 0.5 * r;
显示通知和网址的脚本
<ul> <li>Notifications</li><li id="notifycontent"></li></ul>
如果我单击,我想直接打开url,不要再单击更多时间来打开它 如何解决这一点。 预先感谢
Android Webview - 调用方法 webView.loadUrl 时,chromium 会显示 ANR(带有标题)
如何解决Android Webview - 调用方法 webView.loadUrl 时,chromium 会显示 ANR(带有标题)?
我们有一个使用 Android webview 的应用程序,我们注意到自 2021 年 4 月 7 日起调用以下代码时出现 ANR(该代码在 UIThread 中调用):
public void onLoadUrlWithHeaders(final String url,final Map<String,String> headers) {
Log.d(TAG,"onLoadUrl with headers : " + url);
webView.loadUrl(url,headers);
}
此问题是间歇性的,仅在某些设备上发生。例如在我们的测试设备上: 摩托罗拉 Moto X (4) Android 9 (SDK 28)
三星 SM - A520F Android 8 (SDK 26) - Webview Chrome 90.0.4430.82
问题出现在我们于 2020 年 12 月发布的应用版本中,该版本直到 4 月才出现上述 ANR。
ANR后A520F的/data/anr/traces.txt文件摘录
suspend all histogram: Sum: 340.474ms 99% C.I. 0.042ms-187.678ms Avg: 4.365ms Max: 283.301ms
DALVIK THREADS (69):
"Signal Catcher" daemon prio=5 tid=3 Runnable
| group="system" sCount=0 dsCount=0 flags=0 obj=0x13680248 self=0x7d302c1400
| sysTid=15932 nice=0 cgrp=default sched=0/0 handle=0x7d254fe4f0
| state=R schedstat=( 0 0 0 ) utm=2 stm=3 core=3 HZ=100
| stack=0x7d25404000-0x7d25406000 stackSize=1005KB
| held mutexes= "mutator lock"(shared held)
native: #00 pc 0000000000397510 /system/lib64/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamicns0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+212)
native: #01 pc 000000000045dce8 /system/lib64/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamicns1_11char_traitsIcEEEEbP12BacktraceMapb+348)
native: #02 pc 000000000047549c /system/lib64/libart.so (_ZN3art14DumpCheckpoint3RunEPNS_6ThreadE+880)
native: #03 pc 000000000046d774 /system/lib64/libart.so (_ZN3art10ThreadList13runcheckpointEPNS_7ClosureES2_+480)
native: #04 pc 000000000046d17c /system/lib64/libart.so (_ZN3art10ThreadList4DumpERNSt3__113basic_ostreamicns1_11char_traitsIcEEEEb+796)
native: #05 pc 000000000046cd1c /system/lib64/libart.so (_ZN3art10ThreadList14DumpForSigQuitERNSt3__113basic_ostreamicns1_11char_traitsIcEEEE+920)
native: #06 pc 00000000004426f0 /system/lib64/libart.so (_ZN3art7Runtime14DumpForSigQuitERNSt3__113basic_ostreamicns1_11char_traitsIcEEEE+196)
native: #07 pc 000000000044bb88 /system/lib64/libart.so (_ZN3art13SignalCatcher13HandleSigQuitEv+1676)
native: #08 pc 000000000044a9c0 /system/lib64/libart.so (_ZN3art13SignalCatcher3RunEPv+388)
native: #09 pc 0000000000067d04 /system/lib64/libc.so (_ZL15__pthread_startPv+200)
native: #10 pc 000000000001f348 /system/lib64/libc.so (__start_thread+68)
(no managed stack frames)
"main" prio=5 tid=1 Native
| group="main" sCount=1 dsCount=0 flags=1 obj=0x731fda50 self=0x7d302c0a00
| sysTid=15926 nice=-10 cgrp=default sched=0/0 handle=0x7d353e19c8
| state=R schedstat=( 0 0 0 ) utm=4634 stm=638 core=2 HZ=100
| stack=0x7fd505c000-0x7fd505e000 stackSize=8MB
| held mutexes=
kernel: (Couldn''t read /proc/self/task/15926/stack)
native: #00 pc 00000000035e867c /data/app/com.android.chrome-ZK4DdobzNyyzf7J8pPGLPg==/base.apk (???)
native: #01 pc 00000000033e32d8 /data/app/com.android.chrome-ZK4DdobzNyyzf7J8pPGLPg==/base.apk (???)
at J.N.MAqmDh4t(Native method)
**at org.chromium.content.browser.framehost.NavigationControllerImpl.c(chromium-Monochrome.aab-stable-443008223:17)
at org.chromium.android_webview.AwContents.w(chromium-Monochrome.aab-stable-443008223:35)
at org.chromium.android_webview.AwContents.v(chromium-Monochrome.aab-stable-443008223:14)
at com.android.webview.chromium.WebViewChromium.loadUrl(chromium-Monochrome.aab-stable-443008223:5)**
at android.webkit.WebView.loadUrl(WebView.java:927)
at br.com.gabba.Box.l.o(:-1)
at br.com.gabba.Box.model.BO.k$a.c(:-1)
at br.com.gabba.Box.model.BO.k$a.b(:-1)
at br.com.gabba.Box.model.BO.LoginAuthBO.i(:-1)
at br.com.gabba.Box.model.BO.LoginAuthBO_.H(:-1)
at br.com.gabba.Box.model.BO.LoginAuthBO_$a.run(:-1)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Here is the entire traces.txt
Similar problem in Google Mobile Ads SDK Developers
解决方法
在 Activity onDestroy 上有一个遗留代码。
@Override
protected void onDestroy() {
super.onDestroy();
WebView webView = getWebView();
if (webView != null) {
webView.setWebViewClient(null);
webView.setWebChromeClient(null);
webView.loadUrl("about:blank");
}
}
此代码可以在 webview 中的注销请求后立即执行。当响应仍在等待中时。
在某些时候,在 Chromium 更新之后,当发生这种情况时(onDestroy 带有待处理的响应),在 webView.loadUrl 的下一次执行中观察到 ANR。
我们创建一个控件来等待注销响应以完成活动。 Play 商店中注册的 ANR 数量下降了 99% 以上。或者您可以简单地从 ondestroy 中删除上述代码。
Android Webview -> 在 webview 的 localStorage 中设置值时未捕获的安全错误
如何解决Android Webview -> 在 webview 的 localStorage 中设置值时未捕获的安全错误
我需要通过在本地和会话存储中设置一些属性来在 android 中加载 webview。
我尝试在 webView.evaluateJavascript("window.localStorage.setItem(''$key'',''$val1'');",null)
的帮助下将值保存在本地/会话存储中,但出现以下错误。
未捕获的安全错误:无法从“窗口”读取“localStorage”属性:此文档的访问被拒绝。
webView.settings.javaScriptEnabled = true
webView.settings.domStorageEnabled = true
webView.settings.databaseEnabled = true
webView.settings.allowFileAccess = true
webView.settings.allowContentAccess = true
webView.evaluateJavascript("window.localStorage.setItem(''$key'',null)
webView.loadUrl("url to load")
我还在 manifest 中设置了 android:usesCleartextTraffic="true"
。
对于这个问题有什么建议吗?
解决方法
首先添加这些行
websettings.setDomStorageEnabled(true); // Turn on DOM storage
websettings.setAllowFileAccess(true); // can read the file cache
websettings.setAppCacheEnabled(true); //Enable H5 (APPCache) caching
然后
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
webView.evaluateJavascript("window.localStorage.setItem(''"+ key +"'',''"+ val +"'');",null);
} else {
webView.loadUrl("javascript:localStorage.setItem(''"+ key +"'',''"+ val +"'');");
}
android webview js 交互,响应 webview 图片的响应事件
方案思路,
1. 在点击图片的时候调用本地的 java 方法并给出响应的图片地址
2. 本地获得图片地址后,开启一个遮罩 activity 进行显示和处理
第二步的实现很容易实现,关键是第一步的实现,在网页中点击图片不会调用本地的 java 代码。那么我们需要给这个点击事件加上相应的 js 函数,让点击事件调用的 js 函数来调用我们提前准备好的 java 函数,等我们捕获到图片的 url 剩下的就好处理了。
关键点就是给普通的 html 注入我们的 js 函数,让图片能够响应点击并调用 js 函数,在通过 js 函数来调用我们的 java 函数。听起来好像有点绕,不过也不难,下面我们用代码实现下
对 java 和 js 交互还不熟悉的同学,请参照前面的文章
http://blog.csdn.net/wangtingshuai/article/details/8631835
这次实例的主要功能:点击图片在新的 activity 中展示,对图片能够进行手势操作,包括双指缩放等
效果图
加载 webview 的 activity 代码
[java] view plaincopy
package wst.webview;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {
private WebView contentWebView = null;
@SuppressLint("SetJavaScriptEnabled")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
contentWebView = (WebView) findViewById(R.id.webview);
// 启用 javascript
contentWebView.getSettings().setJavaScriptEnabled(true);
// 随便找了个带图片的网站
contentWebView.loadUrl("http://www.weim.me/12408.html");
// 添加 js 交互接口类,并起别名 imagelistner
contentWebView.addJavascriptInterface(new JavascriptInterface(this), "imagelistner");
contentWebView.setWebViewClient(new MyWebViewClient());
}
// 注入 js 函数监听
private void addImageClickListner() {
// 这段 js 函数的功能就是,遍历所有的 img 几点,并添加 onclick 函数,函数的功能是在图片点击的时候调用本地 java 接口并传递 url 过去
contentWebView.loadUrl("javascript:(function(){" +
"var objs = document.getElementsByTagName(\"img\"); " +
"for(var i=0;i<objs.length;i++) " +
"{"
+ " objs[i].onclick=function() " +
" { "
+ " window.imagelistner.openImage(this.src); " +
" } " +
"}" +
"})()");
}
// js 通信接口
public class JavascriptInterface {
private Context context;
public JavascriptInterface(Context context) {
this.context = context;
}
public void openImage(String img) {
System.out.println(img);
//
Intent intent = new Intent();
intent.putExtra("image", img);
intent.setClass(context, ShowWebImageActivity.class);
context.startActivity(intent);
System.out.println(img);
}
}
// 监听
private class MyWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onPageFinished(WebView view, String url) {
view.getSettings().setJavaScriptEnabled(true);
super.onPageFinished(view, url);
// html 加载完成之后,添加监听图片的点击 js 函数
addImageClickListner();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
view.getSettings().setJavaScriptEnabled(true);
super.onPageStarted(view, url, favicon);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
}
}
}
展示图片的 activity 代码
[java] view plaincopy
package wst.webview;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import android.app.Activity;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.TextView;
public class ShowWebImageActivity extends Activity {
private TextView imageTextView = null;
private String imagePath = null;
private ZoomableImageView imageView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.show_webimage);
this.imagePath = getIntent().getStringExtra("image");
this.imageTextView = (TextView) findViewById(R.id.show_webimage_imagepath_textview);
imageTextView.setText(this.imagePath);
imageView = (ZoomableImageView) findViewById(R.id.show_webimage_imageview);
try {
imageView.setImageBitmap(((BitmapDrawable) ShowWebImageActivity.loadImageFromUrl(this.imagePath)).getBitmap());
} catch (IOException e) {
e.printStackTrace();
}
}
public static Drawable loadImageFromUrl(String url) throws IOException {
URL m = new URL(url);
InputStream i = (InputStream) m.getContent();
Drawable d = Drawable.createFromStream(i, "src");
return d;
}
}
图片布局文件
[html] view plaincopy
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- TODO 默认占位图 -->
<wst.webview.ZoomableImageView
android:id="@+id/show_webimage_imageview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="matrix"
android:src="@drawable/icon" />
<TextView
android:id="@+id/show_webimage_imagepath_textview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textColor="#ffff0000" />
</LinearLayout>
今天关于如何在 Swift iOS 中使 webview 不可点击和swiftui webview的讲解已经结束,谢谢您的阅读,如果想了解更多关于不可点击,因为使用signalr时它在实时同步内部会发生变化、Android Webview - 调用方法 webView.loadUrl 时,chromium 会显示 ANR(带有标题)、Android Webview -> 在 webview 的 localStorage 中设置值时未捕获的安全错误、android webview js 交互,响应 webview 图片的响应事件的相关知识,请在本站搜索。
本文标签: