如题(UIWebView没这事,WKWebView的bug),我在进行邮件Native开发时,进行邮件详情显示时,遇到了问题;邮件正文是用WKWebView进行加载的,而WKWebView加载本地沙盒的图片时,在模拟器上可以读取到图片,但是到了真机上图片就读取不到了;在网上查了很多资料,最终找到了解决办法,特此记录一下;感谢:http://www.cocoachina.com/bbs/read.php?tid-1717986-fpage-189-page-1.html 和 https://www.jianshu.com/p/db6386fada10
因为需要将网页进行本地缓存,所以网页是通过NSString来进行传输的
首先,我加载的网页是由String转化来的,加载方式如下:
[self.webView loadHTMLString:htmlString baseURL:[NSURL URLWithString:@"file:///"]];
htmlString中有<img ...>图片信息,其他信息可以统一存储,但是网页中嵌套的图片需要单独进行缓存处理;先将原始htmlString中图片源码串给扣出来,通过约定好的方法,将图片下载到本地沙盒中(查看真机沙盒目录:https://www.jianshu.com/p/1579cbcacdf5);然后将路径重新拼接替换掉图片src的原始路径,再把拼接好的<img ...>塞回原位置;下面介绍具体路径的替换方法:
首先Pod集成GCDWebServer
#import <GCDWebServer.h>
// 2.定义全局属性
@property (strong, nonatomic) GCDWebServer *webSever;
// 在合适的地方配置本地webServer
// 3. 主要代码
// 开启webServer
- (void)startGCDWebServer {
// 3. 主要代码
_webSever = [[GCDWebServer alloc]init];
[_webSever addGETHandlerForBasePath:@"/" directoryPath:NSHomeDirectory() indexFilename:nil cacheAge:3600 allowRangeRequests:YES];
[_webSever startWithPort:80 bonjourName:nil];
}
// 好了,这就结束了!下面就是拼接路径了
// 栗子:文件存在Library/Caches下有一个文件(文件名:xxx)
NSString *localPath = [NSString stringWithFormat:@"http://localhost/Library/Caches/%@", fileName];
注意:需要首先开启webServer服务
把localPath塞回htmlString中对应位置就能显示图片了
其他具体的处理就根据自身要求进行配置,记住用完需要手动关闭WebServer,代码:
// 关闭webserver
- (void)closeGCDWebServer {
// 这也是为什么要定义全局属性的原因
[_webSever stop];
_webSever = nil;
}
荆轲刺秦王!
网友评论