在 WKWebView 中加载本地文件在设备中不起作用

2024-04-28

我无法在 wkwebview 中加载本地 epub 文件(从文档目录)。它可以在模拟器中运行,但不能在设备中运行。我了解到这是 iOS 8 的一个错误here http://www.openradar.me/18039024。 iOS 8 已经解决了吗?请帮助我我该怎么办。我在设备中遇到错误 -

The operation couldn't be completed. (KCFErrorDomainCFNetwork error 1.)

这是代码片段 -

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    [self.webView removeObserver:self forKeyPath:@"loading"];
    [self.webView removeObserver:self forKeyPath:@"estimatedProgress"];
}


-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [self.webView addObserver:self forKeyPath:@"loading" options:NSKeyValueObservingOptionNew context:nil];
    [self.webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
    [self.progressView setProgress:0.0f animated:NO];

    if ([self.documentDirectory checkEpubFileIfExistsAtPath:self.epubFolder]) {

        NSString *filePath = [NSString stringWithFormat:@"%@/%@/%@/OEBPS/%@", [self.documentDirectory getDocumentsDirectory], self.epubFolder, self.epubName, [_html_link substringToIndex:[_html_link rangeOfString:@"#"].location]];

        //Loading webview with progress bar action
        if ([_html_link rangeOfString:@"#"].location != NSNotFound) {

            self.tag = [_html_link substringFromIndex:[_html_link rangeOfString:@"#"].location];
            NSURL *URL = [NSURL fileURLWithPath:filePath];
            NSURLRequest *request = [NSURLRequest requestWithURL:URL];
            [self.webView loadRequest:request];
        }

    } else {

        NSDictionary *object = [self.alertMessages getMessageObj:@"translationNotAvailable"];
        [self presentViewController:[self.alertController alertWithCustomOkayAction:[object objectForKey:@"title"] message:[object objectForKey:@"msg"] callback:^(void) {

            [self dismissViewControllerAnimated:YES completion:nil];

        }] animated:YES completion:nil];
    }
}

//Constraints for Web View
- (void) setConstraintsForWebView {
    [self.webView setTranslatesAutoresizingMaskIntoConstraints:NO];

    WKWebView *webView = self.webView;
    UIProgressView *progressView = self.progressView;
    UIToolbar *toolBar = self.toolBar;

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-8-[webView]-8-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(webView)]];

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[progressView]-0-[webView]-[toolBar]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(progressView, webView, toolBar)]];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    //Do any additional setup after loading the view.
    self.alertController = [AlertController new];
    self.alertMessages = [AlertMessages new];
    self.documentDirectory = [DocumentDirectory new];
    self.languageController = [LanguageController new];

    //Set observer for webview load
    self.webView = [[WKWebView alloc] initWithFrame:CGRectZero];
    self.webView.navigationDelegate = self;
    [self.view insertSubview:self.webView belowSubview:self.progressView];
    [self setConstraintsForWebView];

}

#pragma mark KVO

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"loading"]) {
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:self.webView.loading];
    } else if ([keyPath isEqualToString:@"estimatedProgress"]) {
        self.progressView.hidden = self.webView.estimatedProgress == 1;
        self.progressView.progress = self.webView.estimatedProgress;
    }
}


#pragma mark Web view navigation delegate

- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    [self.progressView setProgress:0.0f animated:NO];
    if (self.tag) {
        [self.webView evaluateJavaScript:[NSString stringWithFormat:@"window.location.hash='%@'", self.tag] completionHandler:nil];
    }
}

- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error {

    [self presentViewController:[self.alertController alertWithAction:@"Error!" message:error.localizedDescription] animated:YES completion:nil];
}

经过一年多我找到了解决方案,我们需要使用加载文件URL为了访问本地资源,这是我使用 WKWebView 的工作代码,另外我使用 loadHTMLString 而不是加载。vistaweb顺便说一句,在我的 WebView 中

感谢这个答案:在 WKWebView 中加载本地网页文件和资源 https://stackoverflow.com/questions/49638653/load-local-web-files-resources-in-wkwebview#

抱歉,但是是 Swift 语言

        do {

            let local = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0]
            // Loading: Library/Caches/repositorioLocal/esferas/znvUifZhH8mIDr09cX8j/index.html
            let resourceFolder = "repositorioLocal/esferas/znvUifZhH8mIDr09cX8j"
            let fileToLoad = "index.html"

            let urlToFolder = URL(fileURLWithPath: local).appendingPathComponent(resourceFolder)
            let urlToFile =  URL(fileURLWithPath: local).appendingPathComponent(resourceFolder).appendingPathComponent(fileToLoad)
            let fileContent = try String(contentsOf: urlToFile)

            let webConfiguration = WKWebViewConfiguration()
            webConfiguration.preferences.setValue(true, forKey: "allowFileAccessFromFileURLs")
            webConfiguration.allowsInlineMediaPlayback = true

            vistaweb = WKWebView(frame: self.view.frame, configuration: webConfiguration)
            self.vistaweb.loadFileURL(urlToFolder, allowingReadAccessTo: urlToFolder)
            self.vistaweb.loadHTMLString(fileContent, baseURL: urlToFile)
            self.view.addSubview(vistaweb)

        } catch let error {
            print("Error: \(error.localizedDescription)")
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 WKWebView 中加载本地文件在设备中不起作用 的相关文章

  • 小视频播放

    根据我从互联网收集的信息 MPMoviePlayerController 类不支持小视频播放 因此 为了死马当活马医 我想知道可以使用什么样的方法来让小视频在屏幕的一角播放 而不中断屏幕的其余部分 到目前为止 我们已经遇到了两种可行的解决方
  • 解包可选值时意外发现 nil - 使用 ALAMOFIRE

    我正在尝试使用 Alamofire 获取 JSON 格式的数据 当我使用一个 URL 时 它工作正常 当我使用另一个 URL 时 我在解包可选值时收到错误 我似乎无法追踪错误来自哪里 我已采取将代码放入 ViewDidLoad 来跟踪错误
  • 启动使用 Simperium 的应用程序时 objectFromJSONString 崩溃

    我得到了一个JSON当我尝试启动使用 Simperium 框架的应用程序时崩溃 NSCFString objectFromJSONString unrecognized selector sent to instance 0x6c561a0
  • 方法调用中的插入符[重复]

    这个问题在这里已经有答案了 我正在阅读本教程 并遇到了这行代码 这让我感到困惑 localSearch startWithCompletionHandler MKLocalSearchResponse response NSError er
  • 使用 Metal 高效计算 UIImage/CIImage 中有多少透明像素

    我们可以计算有多少个透明像素的最快方法是什么CIImage UIImage 例如 如果我们谈论效率 我的第一个想法是使用Metal Kernel使用任一CIColorKernel左右 但我不明白如何使用它来输出 计数 我还有其他想法 使用某
  • Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“无法导入桥接标头”

    我的 Xcode 项目构建并运行良好 它有 Swift 和 Objective C 代码 它已安装 GPUImage 我向它添加了单元测试 现在它将不再编译 找不到 GPUImage h 文件 导入桥接标头失败 以下是我发现并尝试过的解决方
  • 从 AVAudioRecorder 获取分贝

    我正在尝试从 AVAudio 录音机获取分贝值 这是我目前的代码 我有一个启动录音机的方法 然后是一个读取分贝值的方法 var recorder AVAudioRecorder 全局定义的记录器 然后在此处使用 func init reco
  • 在 iOS 8 中创建通话/双高状态栏?

    是否有调用自定义通话 双高状态栏的标准方法 如果没有 那么构建我自己的功能的最佳起点是哪里 我知道关于如何做到这一点存在一些多年的问题 但没有任何令人满意的答案 有什么新方法可以做到这一点吗 可能在 iOS 8 中 这里没有什么新鲜事 但我
  • 如何读取 Xcode 6.1 Instruments .trace 文件?

    我一直在尝试阅读 trace文件 我使用生成的custom仪器模板 仪器 自动机 分配 Leaks using 仪器 https developer apple com library mac documentation Developer
  • 在 SwiftUI 中,如何执行手势但将手势转发到其后面的视图?

    我正在创建一个工具提示系统 如果用户触摸工具提示之外的任何地方 我想关闭工具提示 我希望这样在工具提示之外的触摸既可以消除工具提示 又可以激活用户点击的任何控件 因此 您可以打开一个工具提示 然后仍然单击工具提示外部的按钮 并在第一次点击时
  • Apple 针对 http 直播流媒体应用程序的政策

    这里有要求 http developer apple com library ios documentation NetworkingInternet Conceptual StreamingMediaGuide UsingHTTPLive
  • Mapkit 在 IOS 13 中使用过多的 CPU

    最近 在一些用户更新到 iOS 13 x 后 我的 iOS 应用程序开始频繁崩溃 在 iOS 12 x 中没有出现该问题 我正在使用 Mapkit 渲染一些 MKPolygons 和 MKPolylines MKPolylines 被删除并
  • 如何在 Xamarin.iOS 应用程序中创建导航?

    我习惯于与Xamarin Forms 我用 XAML 或 C 创建一个页面并导航到它 但现在这是我第一次尝试创建一个不适合的 iOS 应用程序Xamarin Forms 我在 Windows PC 上的 Visual Studio 中进行此
  • 在 UIView 中绘制彩色文本 -drawRect: 方法

    我正在尝试在我的中绘制彩色文本UIView子类 现在我正在使用单视图应用程序模板 用于测试 除了以下内容外 没有任何修改drawRect method 文本已绘制 但无论我将颜色设置为什么 它始终是黑色的 void drawRect CGR
  • 从 plist 文件中解码数据

    我丢失了在 Macbook Air 上用 Textwrangler 编写的文本文件中的一些数据 我在扩展名为 plist 的文件中找到了其中一些 文件是用 xml 编写的 如下所示
  • 以编程方式检测应用程序是否正在设备或模拟器上运行

    我想知道我的应用程序在运行时是在设备还是模拟器上运行 有没有办法检测到这一点 原因是用模拟器测试蓝牙 api http volcore limbicsoft com 2009 09 iphone os 31 gamekit pt 1 woo
  • 如何将 CIFilter 输出到相机视图?

    我刚刚开始使用 Objective C 我正在尝试创建一个简单的应用程序 它显示带有模糊效果的相机视图 我得到了与 AVFoundation 框架一起使用的相机输出 现在 我正在尝试连接 Core 图像框架 但不知道如何连接 Apple 文
  • Swift - 将图像插入 PDF 不再适用于 iOS 13

    目前正在开发在我的贷款计算器应用程序上导出 PDF 的功能 我有一个预览屏幕 可以在您保存 PDF 之前显示它 预览屏幕由带有 html 的 webView 组成 其中包含占位符 我能够成功地将图像插入到正确的占位符上 并将其显示在 PDF
  • IOS 上图像的加密/解密

    我们正在使用加密 解密和 UIIMAGE 如果我们加密和解密 UIIMAge 而不保存到 iphone 画廊中 它工作正常 但如果我们加密 保存到画廊中 将 加密的图像 加载到应用程序中 然后解密它效果不好 我们使用这个函数来加密 解密 保
  • iOS:我如何知道某个属性是否符合 KVO 标准?

    In the 键值观察编程指南 https developer apple com library archive documentation Cocoa Conceptual KeyValueObserving KeyValueObser

随机推荐

  • 从字典返回类属性的数组

    Background 最近试图回答一个question https stackoverflow com q 58835358 9758194 我自己在想是否可以直接从字典项返回类对象属性的数组 Code Imagine TstClass作为
  • AJV自定义关键字验证

    我正在使用 AJV 库来验证我的 JSON 架构 我希望能够验证Startdate成为一个字符串 如果不是字符串 则应将其转换为N A 目前 它仅转换undefined to N A 但是 在这些情况下 它不会按预期工作 null gt 空
  • 在 Selenium Node JS 中打开 gecko 驱动程序的日志记录

    我目前正在使用Selenium 与 Node Js and FireFox并想打开日志记录功能壁虎司机 但我不确定如何 另外我还想知道在哪里可以找到日志 目前这是我实例化驱动程序的方式 var fOptions new firefox Op
  • .net 日历 - 使整个单元执行回发(可点击)

    我已经启动并运行了一个 net 日历 并从数据库中获取信息 默认情况下 天数会应用回发操作 我想做的是将该操作应用于整个单元格 这样用户就不需要仅单击文本链接 我是 dayRenderer 操作 我有以下行来尝试复制该操作 但第二个参数我不
  • 如何强制操作系统收回内存? (C++)

    在我的 C 代码中 我分配了大量内存来创建树 然后在每个节点中使用 删除 来释放内存 删除所有内容后 我检查操作系统使用的内存量 发现内存未释放 这是预期的 因为该进程不会立即将内存返回给操作系统 因为它仍然可能会再次使用它 问题是 我在删
  • 您可以通过 facebook graph api 来控制和定位页面帖子吗?

    Enabling post privacy gating in the Page s privacy settings allows creating of posts with separate Gating and Targeting
  • 不同程序集中的实体容器和模型生成

    我正在做一些重构 并尝试重用我生成的实体模型 我的应用程序有一些程序集 其中一个是我的外向公共类型 API 另一个包含提供程序的实现 例如日志 我想拆分实体和模型的生成 以便实体位于 API 程序集中 容器位于实现程序集中 这可能吗 有可能
  • 将base64转换为base62(不含特殊字符)

    我想在 URL 中传递河豚加密字符串 并希望像 base64 一样对其进行编码 但没有任何特殊字符 像 base62 这样的东西就很好 0 9a zA Z 所以我想做的是使用base64 encode 转换河豚加密字符串 并将base64
  • 如何使用不同的类和导入动态地使用 Python 日志记录来更改文件句柄

    我无法执行即时日志文件句柄更改 例如 我有3节课 one py import logging class One def init self txt logging debug Hey I m the class One and I say
  • WP7 上的 POST 请求

    我花了大约 6 个小时试图弄清楚如何在 WP7 中发出常规 POST 请求 我尝试了此处和许多其他地方发布的类似问题的答案 我还尝试了许多不同的 API POST 请求 它们都导致针对某一特定问题 远程服务器返回错误 NotFound 好像
  • 通过 CloudFlare 获取正确的访客 IP [重复]

    这个问题在这里已经有答案了 我正在使用其他人转售给我的 cPanel 这可能意味着我无法使用mod cloudflare 我想获取访问者的 IP 而不是 CloudFlare IP 我正在使用的代码部分 SERVER REMOTE ADDR
  • 让子进程等待直到收到父进程的信号

    我想从父级创建 N 个子级 我希望所有的孩子同时开始 一个功能 测量时间 因此 我将该函数放入信号处理程序中 当父级完成创建 分叉 所有子级时 它会向所有子级发送信号 使用kill children id 以让 make 开始 代码如下 但
  • 将多个子域映射到同一个 S3 存储桶

    有没有某种方法可以将多个 数千个 子域映射到一个 s3 存储桶 如果是这样 是否也可以将其映射到每个子域的存储桶中的特定路径 我希望 test1 example com 映射到 mybucket test1 test2 example co
  • 如何批量删除Redis中数十万个带有特殊字符的key

    我们有一个包含数十万个 Redis 键的列表 其中包含各种特殊字符 我们希望批量删除它们 对于这个问题上的类似问题 有一些很好的答案 如何使用 Redis 自动删除与模式匹配的键 https stackoverflow com questi
  • 将 JSON 与嵌套数组和 json 进行比较(数组顺序无关紧要)

    你好 我正在尝试比较java中的两个json 每个键可以包含一个json对象或json对象数组 并且它们中的每个也可以是数组或json 这是 Json 的示例 id 123123asd123 attributes name apps val
  • 为什么在生产中得到空 CSS 文件?

    我在文件中放入了很多css文件active admin css scss Active Admin s got SASS import active admin mixins import active admin base import
  • TypeScript:使用调用签名和构造函数签名实现接口

    是否可以创建一个实现以下接口的对象 interface I string new any 我看到可以实现一个具有调用签名和这个问题的一些字段的接口 使用裸函数签名和其他字段实现 TypeScript 接口 https stackoverfl
  • 动态添加组件到 JDialog

    当用户单击 JDialog 上的按钮时 我在将组件添加到 JDialog 时遇到问题 基本上我希望它看起来像这样 然后 当用户单击 添加新字段 时 我希望它看起来像这样 我似乎无法打开添加新 JLabel 或 JTextField 的对话框
  • Javascript 子字符串方法帮助

    长话短说 我正在开发一个 Web 应用程序并在其中使用 AJAX 我试图禁用点击时链接的默认操作 将哈希值附加到链接 然后从网址中删除 我遇到的问题是 虽然哈希值被相应地附加 但子字符串方法并没有提取 而是提取了它后面的字母 这是我的代码
  • 在 WKWebView 中加载本地文件在设备中不起作用

    我无法在 wkwebview 中加载本地 epub 文件 从文档目录 它可以在模拟器中运行 但不能在设备中运行 我了解到这是 iOS 8 的一个错误here http www openradar me 18039024 iOS 8 已经解决