LoadFileUrl 和 LoadHtmlString 未加载本地文档资源

Posted

技术标签:

【中文标题】LoadFileUrl 和 LoadHtmlString 未加载本地文档资源【英文标题】:LoadFileUrl and LoadHtmlString not loading local document resources 【发布时间】:2019-02-07 21:43:17 【问题描述】:

基本上使用使用 WKWebview 的 HybridWebView 我正在加载一个 html 文件,其中包含存储在应用程序文档目录中的一堆 css 文件。 示例

var/mobile/Containers/Data/Application/C9D9BB56-79B6-4990-A599-18C6AD928A22/Documents

我可以使用 LoadFileUrl 或 LoadHTMLString 很好地加载 html,问题是引用的 css 和 js 没有加载到 webview 中

这是我的文件地址

file:///var/mobile/Containers/Data/Application/C9D9BB56-79B6-4990-A599-18C6AD928A22/Documents/Courses/2d7d0a7d-145a-41d0-9abf-685a2b5dfc3c/Online_Placement_Test_no_timer_pack/YKZOP4NACH3EPJNTG6M4T2BQDI/Unit_4_5/995/Unit.html

基本网址

file:///var/mobile/Containers/Data/Application/C9D9BB56-79B6-4990-A599-18C6AD928A22/Documents/Courses/2d7d0a7d-145a-41d0-9abf-685a2b5dfc3c/Online_Placement_Test_no_timer_pack/YKZOP4NACH3EPJNTG6M4T2BQDI/Unit_4_5/995/

这是从 Safari 中的网络检查器抓取的未加载资源的路径示例。

file:///var/mobile/Containers/Data/Application/C9D9BB56-79B6-4990-A599-18C6AD928A22/Documents/Courses/2d7d0a7d-145a-41d0-9abf-685a2b5dfc3c/Online_Placement_Test_no_timer_pack/YKZOP4NACH3EPJNTG6M4T2BQDI/Unit_4_5/995/js/bootstrap.min.js

不知道我在这里做错了什么。我什至设置了

<key>NSAppTransportSecurity</key>
    <dict>
    <key>NSAllowsLocalNetworking</key>
    <true/>
        <key>NSAllowsArbitraryLoads</key>
        <true/>    
    </dict>

在 info.plist 中

【问题讨论】:

【参考方案1】:

您可以通过NSFileManager.DefaultManager.GetUrl获取文档目录。

从 App 的文档目录加载“WebSite”示例

var docsDir = NSFileManager.DefaultManager.GetUrl(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User, null, true, out var error);
var data = NSUrl.FromFilename(Path.Combine(docsDir.Path, "WebSite", "index.html"));
var content = NSUrl.FromFilename(Path.Combine(docsDir.Path, "WebSite"));
webView.LoadFileUrl(data, content);

从捆绑资源加载“网站”的示例:

var bundlePath = NSBundle.MainBundle.BundlePath;
var data = NSUrl.FromFilename(Path.Combine(bundlePath, "WebSite", "index.html"));
var content = NSUrl.FromFilename(Path.Combine(bundlePath, "WebSite"));
webView.LoadFileUrl(data, content);

使用下载的 Azure 示例网站

注意:下载到NSSearchPathDirectory.DocumentDirectory 内的WebSite 子目录

├── css
│   └── site.css
├── fonts
│   └── segoeuil.ttf
├── img
│   ├── cloneWhite.svg
│   ├── deployWhite.svg
│   ├── lightbulbWhite.svg
│   ├── stackWhite.svg
│   ├── successCloudNew.svg
│   └── tweetThis.svg
└── index.html

本地输出:

【讨论】:

先生,您是冠军。做了一些改动。 var docsDir = NSFileManager.DefaultManager.GetUrl(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User, null, true, out var error); var data = NSUrl.FromFilename(Path.Combine(docsDir.Path, Element.iosPath)); ` var content = NSUrl.FromFilename(Path.Combine(docsDir.Path, "Courses"));` 我出错的地方是 readAccessUrl。我只需要包含到 Courses 目录。【参考方案2】:

在 iOS13 的 Objective-C 中使用 WebKit WKWebView 从文件系统的 App 的缓存目录中加载本地存储的网站或 html-File

注意非常重要的 webView.configuration.preferences 设置 allowFileAccessFromFileURLs!!

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *docsDir = [paths objectAtIndex:0];
NSString *downloadDir = [[NSString alloc] initWithFormat:@"%@/%@", docsDir, @"www"];

NSURL* downloadDirUrl = [[NSURL alloc] initFileURLWithPath:downloadDir];
NSLog(@"DIR  '%@'", downloadDirUrl);
NSURL* indexHtmlUrl = [[NSURL alloc] initWithString:[[NSString alloc] initWithFormat:@"%@/%@", downloadDir, @"/index.html?param=val"]];
NSLog(@"HTML '%@'", indexHtmlUrl);

WKWebView* webView = ...;
[webView.configuration.preferences setValue:@YES forKey:@"allowFileAccessFromFileURLs"];
[webView loadFileURL:indexHtmlUrl allowingReadAccessToURL:downloadDirUrl];

【讨论】:

以上是关于LoadFileUrl 和 LoadHtmlString 未加载本地文档资源的主要内容,如果未能解决你的问题,请参考以下文章

OSX Sandbox WKWebView 在里面加载本地文件

如果之前已加载某些网页,WKWebView 不会加载 .archive 文件

Could not create a sandbox extension for /

IOS9 WKWebView Access-Control-Allow-Origin

从 JavaScript 加载 WKWebView 中 iOS tmp/ 文件夹中的图像文件

& 和 && 区别和联系,| 和 || 区别和联系