Xamarin.Forms/Xamarin.Android WebView 内的链接将不起作用
Links inside of a Xamarin.Forms/Xamarin.Android WebView won't work
我有一个 Xamarin.Forms 应用程序可以在 WebView 中打开本地保存的 HTML 文件,这些文件包含彼此相关的 link(想想旧的 HTML 离线文档) .在 Android 10 中一切正常,但现在我需要在 Xamarin.Android 中制作自定义渲染器,因为新的 Android 11 更改需要 AllowFileAccess(我目前拥有所有访问权限以进行测试,直到我得到这个问题已解决)在 WebSettings 中。 WebView 的 OnElementChange 设置控件的所有设置,设置 WebClient(它有一个 ShouldOverrideUrlLoading 设置来处理特定的文件类型,如 PDF),然后加载 URL。第一页加载正常,但 link 中的 none 运行(此测试页面有几个 link 到其他 HTML 页面和一些 PDF)。照常单击突出显示它们,但没有打开。
当我单击 link 时,WebClient 的 ShouldOverride 中没有断点被命中,Android WebView 的 OnElementChanged 中也没有断点。输出 window 注册触摸,但不做任何其他事情。我觉得这是 Xamarin.Forms WebView 和 Xamarin.Android WebView 之间的某种通信问题(甚至可能 Xamarin.Android 的 WebView 没有与 Android 的 WebView 保持同步), 但我不知道去哪里找。有没有人 运行 遇到过类似的情况并且有解决办法让 link 再次运行?
谢谢。
在流了很多血、汗水和泪水之后,我找到了解决办法。
首先,WebView 不会直接告诉您,但是任何针对新 window(IE _blank 和可能的其他对象)的内容都不会命中您的 WebViewClient 的 ShouldOverrideUrlLoading 方法,而是命中您的 WebViewChromeClient 的 OnCreateWindow 方法。因此,您需要通过该客户端以及您的 WebViewClient 处理加载。
其次,由于 WebView 中的安全浏览,链接并不总是有效。同样,Google 没有具体说明它会导致 urls 出现问题,但它适用于外部 urls(在文件中可能是每个 url)。我不得不将其关闭,您可以在 developer.android.com/guide/webapps/managing-webview 找到相关说明,并且我能够正常导航。我觉得你会想要设置保护措施来防止人们滥用你的应用程序(比如有一个 WebView 是为你的东西关闭安全浏览而另一个为所有其他人,或者阻止任何不属于你的网站)因为网络安全总是一件事
最后,我发现如果您在传递给 WebViewClient 的 ShouldOverrideUrlLoading 的视图中手动加载页面,IFrame 将无法正确加载。尺寸在我的文档中全部关闭,这让我相信如果你 return false 并且 WebView 处理它,后台的精灵会做一些特别的事情。我发现我需要处理所有其他情况(IE pdf、图像等),然后如果是我的 iframe htmls,则从 ShouldOverrideUrlLoading return false。
请注意,因为在 Windows 上工作了这么久,我忘记了这一点,请记住 Android 的基本文件系统区分大小写,这使得链接区分大小写。您需要确保文件中的所有大小写都正确,或者如果您希望它们不敏感,则将它们放在 FAT 文件系统 SD 卡上。
我有一个 Xamarin.Forms 应用程序可以在 WebView 中打开本地保存的 HTML 文件,这些文件包含彼此相关的 link(想想旧的 HTML 离线文档) .在 Android 10 中一切正常,但现在我需要在 Xamarin.Android 中制作自定义渲染器,因为新的 Android 11 更改需要 AllowFileAccess(我目前拥有所有访问权限以进行测试,直到我得到这个问题已解决)在 WebSettings 中。 WebView 的 OnElementChange 设置控件的所有设置,设置 WebClient(它有一个 ShouldOverrideUrlLoading 设置来处理特定的文件类型,如 PDF),然后加载 URL。第一页加载正常,但 link 中的 none 运行(此测试页面有几个 link 到其他 HTML 页面和一些 PDF)。照常单击突出显示它们,但没有打开。
当我单击 link 时,WebClient 的 ShouldOverride 中没有断点被命中,Android WebView 的 OnElementChanged 中也没有断点。输出 window 注册触摸,但不做任何其他事情。我觉得这是 Xamarin.Forms WebView 和 Xamarin.Android WebView 之间的某种通信问题(甚至可能 Xamarin.Android 的 WebView 没有与 Android 的 WebView 保持同步), 但我不知道去哪里找。有没有人 运行 遇到过类似的情况并且有解决办法让 link 再次运行?
谢谢。
在流了很多血、汗水和泪水之后,我找到了解决办法。
首先,WebView 不会直接告诉您,但是任何针对新 window(IE _blank 和可能的其他对象)的内容都不会命中您的 WebViewClient 的 ShouldOverrideUrlLoading 方法,而是命中您的 WebViewChromeClient 的 OnCreateWindow 方法。因此,您需要通过该客户端以及您的 WebViewClient 处理加载。
其次,由于 WebView 中的安全浏览,链接并不总是有效。同样,Google 没有具体说明它会导致 urls 出现问题,但它适用于外部 urls(在文件中可能是每个 url)。我不得不将其关闭,您可以在 developer.android.com/guide/webapps/managing-webview 找到相关说明,并且我能够正常导航。我觉得你会想要设置保护措施来防止人们滥用你的应用程序(比如有一个 WebView 是为你的东西关闭安全浏览而另一个为所有其他人,或者阻止任何不属于你的网站)因为网络安全总是一件事
最后,我发现如果您在传递给 WebViewClient 的 ShouldOverrideUrlLoading 的视图中手动加载页面,IFrame 将无法正确加载。尺寸在我的文档中全部关闭,这让我相信如果你 return false 并且 WebView 处理它,后台的精灵会做一些特别的事情。我发现我需要处理所有其他情况(IE pdf、图像等),然后如果是我的 iframe htmls,则从 ShouldOverrideUrlLoading return false。
请注意,因为在 Windows 上工作了这么久,我忘记了这一点,请记住 Android 的基本文件系统区分大小写,这使得链接区分大小写。您需要确保文件中的所有大小写都正确,或者如果您希望它们不敏感,则将它们放在 FAT 文件系统 SD 卡上。