需求
需要加载一个在线的 Web,通过 JSBridge
获取到 Native 的资源路径,比如 file:///private/xxxx/xxx/xx.png
把它显示在 WebView
当中。 举个例子吧: 一个 HTML
的 Image
标签想显示iOS 沙盒里面的资源文件。
<image src="file:///private/xxxx/xxx/xx.png"></image>
测试之后发现简单写本地路径的路子走不通。
查阅资料后发现通过 App 本地开启 Server 服务,Root 开在沙盒目录,然后通过将文件的 file协议
路径转换成本地服务路径,再给 H5 显示,经过测试完全可用。
第一步: 在 Podfile
写入(关于 GCDWebServer,一个轻量级的 AppServer 框架。)
pod "GCDWebServer", "~> 3.0"
pod install 集成后,在用到的地方
#import "GCDWebServer.h"
GCDWebServer*_webServer = [[GCDWebServer alloc] init];
[_webServer addGETHandlerForBasePath:@"/" directoryPath:NSHomeDirectory() indexFilename:nil cacheAge:3600 allowRangeRequests:YES];
[_webServer startWithPort:80 bonjourName:nil];
// 比方说文件存在Library下有一个123的文件
// NSString *basePath = @"http://localhost/Library/Caches/hxyhd/emeeting/imageurl.png"; // 这样就可以访问到这个文件了,我只需要把我的文件名拼上localhost路径然后传给前端,他们拿到这个链接直接访问就可以拿到这个文件了
然后在H5中需要加载资源的标签里 赋值完整地址如http://localhost/Library/Caches/hxyhd/emeeting/imageurl.png 就可以了
Caches/hxyhd/emeeting/imageurl.png
问题记录
GCDWebServer不支持长链接,只要App退到后台,connect自动就stop,网页请求无法获得响应。
解决办法:
-1)开启支持后台模式:将GCDWebServer.m中的GCDWebServerOption_AutomaticallySuspendInBackground设置为NO;
-2)打开Background Modes;
-3)在AppDelegate.m写上这段代码
-(void)applicationDidEnterBackground:(UIApplication *)application{
[[UIApplication sharedApplication]beginBackgroundTaskWithExpirationHandler:nil];;
}