【问题标题】:Setting BaseUrl on files loaded from Environment.SpecialFolder.LocalApplicationData在从 Environment.SpecialFolder.LocalApplicationData 加载的文件上设置 BaseUrl
【发布时间】:2019-06-26 12:22:45
【问题描述】:

这应该很简单,但它让我很头疼。 基本上我正在创建一个下载包含 html、css、javascript 等的 zip 文件的应用程序。 它解压缩内容并将它们存储在 LocalApplicationData 中,将 index.html 加载到 webview 中,如下所示:

HtmlWebViewSource html = new HtmlWebViewSource();

html.Html = htmlString;
html.BaseUrl = DependencyService.Get().Get();
courseWindow.Source = html;

所有这一切都很好,除了我以未格式化的 html 结尾,没有运行脚本等。 我假设这与 baseURL 有关,但它可能是其他类似资源被阻止加载的东西吗?

如果有人遇到过同样的问题或能指出我正确的方向,那就太好了。

这是我的 Android 项目中的内容。

[assembly: Dependency(typeof(BaseUrl))]
namespace TCMobile.Droid
{
    public class BaseUrl : iBaseURL
    {
        public string Get()
        {
            return "file:/" + System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData);
        }
    }
}

我还尝试将路径硬编码到加载 html 的确切目录。

[assembly: Dependency(typeof(BaseUrl))]
namespace TCMobile.Droid
{
    public class BaseUrl : iBaseURL
    {
        public string Get()
        {
            return "file:/" + System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData) +
                "Courses/2d7d0a7d-145a-41d0-9abf-685a2b5dfc3c/Online_Placement_Test_no_timer_pack/YKZOP4NACH3EPJNTG6M4T2BQDI/Unit_4_5/995/";
        }}
    }

通过断点,我可以看到返回的路径,并且看起来很好。

作为测试,我尝试使用 iframe 传递一个 html 字符串,该 iframe 的源代码是我的本地 html。这很好地加载了 html,但给了我一堆 js 的跨域问题。因为框架需要相互交互。如果我能解决 iframe 的安全问题,我会接受这种方法。

经过更多的探索,我发现了这种奇怪之处。

所以这很奇怪。 在 iOS 中,这就是我所看到的

文件网址 - 看起来不错

file:///var/mobile/Containers/Data/Application/04BFAB43-2D92-48D3-941D-C48C8686E0A5/Documents/Courses/2d7d0a7d-145a-41d0-9abf-685a2b5dfc3c/Online_Placement_Test_no_timer_pack/YKZOP4NACH/3EPJNTG6M94T2EPJNTG6M94T2 Unit.html/

BaseUrl 看起来不错

file:///var/mobile/Containers/Data/Application/04BFAB43-2D92-48D3-941D-C48C8686E0A5/Documents/Courses/2d7d0a7d-145a-41d0-9abf-685a2b5dfc3c/Online_Placement_Test_no_timer_pack/YKZOP4NACH/3EPJNTG6M94T2EPJNTG6M94T2

Web 检查器中包含的 Js - 很奇怪,注意 html 文件名是如何添加的。现在这没有,因为

file:///var/mobile/Containers/Data/Application/04BFAB43-2D92-48D3-941D-C48C8686E0A5/Documents/Courses/2d7d0a7d-145a-41d0-9abf-685a2b5dfc3c/Online_Placement_Test_no_timer_pack/YKZOP4NACH/3EPJNTG6M94T2EPJNTG6M94T2 Unit.html/js/bootstrap.min.js

【问题讨论】:

  • 更新:我已经更改了将 html 加载到 Control.LoadFileUrl(fileUrl, fileUrl); 的方式现在引用的 css 和 js 的路径看起来是正确的,但它们仍然没有加载。我已经尝试过 NSAppTransportSecurityNSAllowsArbitraryLoadsInWebContentNSAppTransportSecurityNSAllowsArbitraryLoads键>

标签: ios xamarin.forms webview wkwebview base-url


【解决方案1】:

我猜你已经从 WebView docs 获得了依赖服务,所以你正在尝试在每个平台上正确地配置 BaseUrl

你能分享你的依赖服务代码吗?您必须对 sample 进行一些更改,因为它假定您的 html、css、javascript 位于应用程序的静态资源中。相反,您希望将路径返回到您保存它们的位置。

【讨论】:

  • 我很确定这是一个 NSAppTransportSecurity 问题。我已经切换到 HybridWebview,现在 html 在 Android 中加载良好,但在 iOS 中仍然得到未格式化的 html。如果我传入了不正确的基本 url,html 根本不会加载,所以这就是为什么我倾向于 NSAppTransportSecurity 甚至尝试将渲染切换到 LoadHtmlString、LoadFileUrl 和 LoadRequest。没有运气。
  • 可以通过 Info.plist 禁用 NSAppTransportSecurity 检查——您是否尝试过验证您的假设?
  • 是的,尝试了所有变体。 NSAppTransportSecurityNSAllowsArbitraryLoads
猜你喜欢
  • 1970-01-01
  • 2018-06-20
  • 2015-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多