Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 加载本地web文件&;WKWebView中的资源_Swift_Cocoa_Cocoa Touch_Webkit_Wkwebview - Fatal编程技术网

Swift 加载本地web文件&;WKWebView中的资源

Swift 加载本地web文件&;WKWebView中的资源,swift,cocoa,cocoa-touch,webkit,wkwebview,Swift,Cocoa,Cocoa Touch,Webkit,Wkwebview,与UIWebView和以前版本的WKWebView(iOS 10和macOS 10.12)不同,本地文件的默认加载操作已从Bundle.main.path移动到Bundle.main.url。类似地,loadFileURL也成为在WKWebView中加载本地资源的默认函数 我知道.path和.url是完全不同的,它们在过去都起过作用–.path历来是默认选择的方法;然而,Swift的最新版本似乎打破了大部分(如果不是全部的话)的.path解决方案。.path解决方案现在似乎将目录层次结构扁平化,

与UIWebView和以前版本的WKWebView(iOS 10和macOS 10.12)不同,本地文件的默认加载操作已从
Bundle.main.path
移动到
Bundle.main.url
。类似地,
loadFileURL
也成为在WKWebView中加载本地资源的默认函数

我知道
.path
.url
是完全不同的,它们在过去都起过作用–
.path
历来是默认选择的方法;然而,Swift的最新版本似乎打破了大部分(如果不是全部的话)的
.path
解决方案。
.path
解决方案现在似乎将目录层次结构扁平化,将所有CSS、JS和任何其他子目录内容放在一个大目录中。当WKWebView尝试加载index.html(例如,使用链接的子文件夹样式表)(即
/css/style.css
)时,这会导致加载错误

在看到大量的问题和无数不确定/不完整的答案后,是否有一个快速、无痛的解决方案来实现可以加载本地资源(包括链接的CSS/JS文件)的WKWebView,而无需任何解决方法?

针对Swift 4,Xcode 9.3更新


此方法允许WKWebView正确读取链接CSS、JS和大多数其他文件的目录和子目录层次结构。您不需要更改HTML、CSS或JS代码

解决方案(快速)
  • 将web文件夹添加到项目(文件>将文件添加到项目)
    • 如果需要,复制项目
    • 创建文件夹引用*
    • 添加到目标(适用的)
  • 将以下代码添加到
    viewDidLoad
    并根据您的需要对其进行个性化设置:

    let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "website")!
    webView.loadFileURL(url, allowingReadAccessTo: url)
    let request = URLRequest(url: url)
    webView.load(request)
    

  • 解决方案(深入) 第一步 将本地web文件的文件夹导入到项目的任意位置。确保您:

    ☑️ 如果需要,复制项目

    ☑️ 创建文件夹引用(不是“创建组”)

    ☑️ 增加目标

    步骤2 使用WKWebView转到视图控制器,并将以下代码添加到
    viewDidLoad
    方法:

    let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "website")!
    webView.loadFileURL(url, allowingReadAccessTo: url)
    let request = URLRequest(url: url)
    webView.load(request)
    
    • 索引
      –要加载的文件名(不带扩展名
      .html
    • website
      –web文件夹的名称(
      index.html
      应位于此目录的根目录下)
    结论 整个代码应该如下所示:

    import UIKit
    import WebKit
    
    class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {
    
        @IBOutlet weak var webView: WKWebView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            webView.uiDelegate = self
            webView.navigationDelegate = self
    
            let url = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "Website")!
            webView.loadFileURL(url, allowingReadAccessTo: url)
            let request = URLRequest(url: url)
            webView.load(request)
        }
    
    }
    
    如果你们有任何人对这个方法或代码有进一步的问题,我会尽力回答

    这是我的工作:

            WKWebView *wkwebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
            wkwebView.navigationDelegate = self;
            wkwebView.UIDelegate = self;
            [wkwebView.configuration.preferences setValue:@"TRUE" forKey:@"allowFileAccessFromFileURLs"];
            NSURL *url = [NSURL fileURLWithPath:YOURFILEPATH];
            [wkwebView loadFileURL:url allowingReadAccessToURL:url.URLByDeletingLastPathComponent];
            [self.view addSubview:wkwebView];
    

    我面临的问题和我的情况一样,我正在下载一些 HTML内容,并将其保存到文档目录,然后 在应用程序中显示它。同一控制器使用实时URL 此外,我必须把url方案的条件在iOS 13 Xcode 11上测试

      if Url.scheme == "file" as String {
             wkWebView.loadFileURL(Url, allowingReadAccessTo: Url)
        }
        else {
             let request = URLRequest.init(url: Url, cachePolicy:.reloadIgnoringLocalCacheData, timeoutInterval:60)
             wkWebView.load(request)
        }
    

    它非常适合我

    1,打开项目设置,进入构建阶段选项卡,打开链接二进制库。添加Webkit框架

    2、将html添加到项目中(如果需要,复制项目)

    3、将此项添加到代码中: @ibvar-webView:WKWebView

    4、视图加载

    使用
    WKWebView
    可以使用项目中的资源,甚至可以使用html代码中的共享库
    例如,我展示了如何从包含
    ResourceContainingBundleClassName
    类的bundle加载
    pic.png

    NSSTring * htmlCode = @"<img src='pic.png'>";
    NSBundle * bundle = [NSBundle bundleForClass:[ResourceContainingBundleClassNamed class]];
    NSURL * base = bundle.resourceURL;
    WKWebView * represent = [WKWebView new];
    [represent loadHtmlString: htmlCode baseURL: base];
    
    NSSTring*htmlCode=@”;
    NSBundle*bundle=[NSBundle bundleForClass:[ResourceContainingBundleClassNamed];
    NSURL*base=bundle.resourceURL;
    WKWebView*表示=[WKWebView新建];
    [表示loadHtmlString:htmlCode baseURL:base];
    

    神奇之处在于
    resourceURL
    bundle属性。如果您只是获取所需文件的路径,则将其转换为URL-不成功。

    非常感谢。一直在努力寻找有效的解决方案!这也是将一个简单的HTML5(包括几个JS libs)应用程序包装到macOS应用程序中的方法吗?我不明白为什么还要调用
    .load(request)
    。我认为
    loadFileURL()
    是加载本地文件的首选方式,
    load(request)
    是否做了额外的工作?我得到:致命错误:在展开可选值时意外发现nil。我能让它工作的唯一方法是,我将index.html放在与xcodeproj文件相同的文件夹中,并使用“/”作为子目录。您不需要调用
    load
    。只需调用
    loadFileURL
    。第二个
    load
    没有意义。是否需要在委托方法中执行任何操作?我下载了一个PDF文件并保存到文档目录。我可以从模拟器的文档目录中预览PDF文件,但是wkWebView没有显示任何内容,也不知道为什么。我还遗漏了什么吗?对于pdf文件,您可以使用PDFKITT查看这里,非常感谢!我已经下载了本地文档目录文件夹中的图像,现在我有一个html字符串,其中包含img的最后一个路径组件,理想情况下保存在docDirectory中,如何将该字符串中的所有图像加载到wkwebview,请您指导我步骤。您以何种形式保存了html内容,我已分别保存了所有图像