我无法在 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(使用前将#替换为@)