【问题标题】:WKWebView loadFileURL works only onceWKWebView loadFileURL 只工作一次
【发布时间】:2017-03-21 05:54:27
【问题描述】:

我需要在 WKWebView 中加载本地文件。我正在使用新的 ios9 方法

- (nullable WKNavigation *)loadFileURL:(NSURL *)URL allowingReadAccessToURL:(NSURL *)readAccessURL

它在第一次加载时完美运行(导航委托被正确调用),但如果我尝试加载一个新的不同文件,它什么也不做。

修改了 wkwebview 实例中 currentItem 的 URL。但是,如果我强制重新加载,则使用先前设置的 URL 调用委托方法 didFinishNavigation。我也尝试向前导航,但应该加载的文件是当前文件,它不在 backForwardList 上。

我用来启动 WKWebView 并加载文件的代码:

self.wk_webview = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
self.wk_webview.scrollView.delegate = self;
self.wk_webview.navigationDelegate = self;
[self.view addSubview:self.wk_webview];

NSURL *url = [NSURL fileURLWithPath:local_path];
[self.wk_webview loadFileURL:url allowingReadAccessToURL:[url URLByDeletingLastPathComponent]];

我错过了什么吗?我找不到与此相关的任何内容。

感谢您的帮助。

【问题讨论】:

    标签: ios objective-c ios9 wkwebview


    【解决方案1】:

    我遇到了与您的问题非常相似的问题,但在我的情况下,我在 UIViewCell 对象中引用了 WKWebView 对象(我最近从 UIWebView 迁移)。

    由于性能原因,我正在重用 WKWebView 对象(标准出列可重用的东西)。

    长话短说,您在 loadFileURL:allowingReadAccessToURL: 方法中有一个 allowedReadAccessToURL 参数,该参数告诉 WKWebView 在加载本地文件时允许哪些路径。由于某种原因,当加载某些具有不同allowReadAccessToURL 参数的页面时,它并不关心此参数。所以我推荐使用整个 Documents 路径空间作为这个方法的默认参数:

    NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] objectAtIndex:0];
    [self loadFileURL:request.URL allowingReadAccessToURL:documentsURL];
    

    希望对你有帮助。

    【讨论】:

    • 它没有帮助我。
    • 在 "allowingReadAccessToURL:" 中传递包含要加载的候选文件的整个目录非常重要,否则当您尝试在 webView 中加载另一个文件时,它将无法正常工作。
    • 非常适合我传递父目录。
    • MacOS 上的任何人都可以在沙盒环境中成功使用它。 vs 请求负载?
    【解决方案2】:

    终于!我知道哪里出错了!! 当您要加载新的不同文件时,请确保它与第一个加载文件位于同一目录中。

    例如。

    NSString *pathA = "file:///path/to/abc/dirA/A.html";
    NSString *pathB = "file:///path/to/abc/dirB/B.html";
    NSString *pathC = "file:///path/to/abc/dirC/C.html";
    
    
    NSURL *url = [NSURL fileURLWithPath:pathA];
    
    NSURL *readAccessToURL = [[url URLByDeletingLastPathComponent] URLByDeletingLastPathComponent];
     // readAccessToURL == "file:///path/to/abc/"
    
    [self.wk_webview loadFileURL:url allowingReadAccessToURL:readAccessToURL];
    // then you want load  pathB
    url = [NSURL fileURLWithPath:pathB];
    // this will work fine
    [self.wk_webview loadFileURL:url allowingReadAccessToURL:readAccessToURL];
    

    【讨论】:

    • 我现在无法测试您的答案,但如果 html 文件需要位于同一目录中,则无论如何这不是一个合适的解决方案。我最终使用了较旧的 uiwebkit api,它按预期工作。
    • 为什么苹果创造的一切都必须是混乱的?我确信他们讨厌开发人员。为什么不简单地添加 myWebView.loadURL ?在那里创建这些 API 的人有精神问题。
    • 它不必在同一个目录中。但是...它必须位于您在上一次调用中设置为“allowingRadAccessToURL”的目录中。这是一个非常糟糕的错误 IMO。因此,就我而言,我将允许的目录从我的 html 文件所在的位置设置为一个,这样我仍然可以从我的第一个同级目录中加载其他 html 文件。
    【解决方案3】:

    我也遇到过这个问题。对我有用的是简单地刷新包含 webView 的 UIView 容器:

    [webView loadFileURL:url allowingReadAccessToURL:[url URLByDeletingLastPathComponent]];
    [webViewContainer setNeedsDisplay];
    [webViewContainer setNeedsLayout];
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-06
      • 2018-06-22
      • 2015-09-18
      • 2013-12-31
      • 1970-01-01
      • 2013-09-28
      • 2013-03-30
      相关资源
      最近更新 更多