我正在开发一个iOS应用程序,需要在UIWebView内的服务器上显示网页,同时根据需要注入相关的本地png和css文件,以加快加载时间。以下是我尝试执行此操作的代码:
NSData *myFileData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.example.com/index.html"]]];
NSString* myFileHtml = [[NSString alloc] initWithData:myFileData encoding:NSASCIIStringEncoding];
[myWebView loadHTMLString:myFileHtml baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
我的问题是,有些网页上有按钮,链接到服务器上的其他网页,而且由于UIWebView只加载字符串,因此点按时按钮不会导致UIWebView加载新的网页网址就像我使用loadRequest方法一样。
我的问题是如何让UIWebView表现得像是在从baseurl注入本地文件时加载请求?
由于
答案 0 :(得分:0)
NSURLPRotocol是NSURLConnection的处理程序,可让您拦截对服务器的调用并替换您自己的内容。
1)从NSURlProtocol
派生一个类2)在您的应用程序中调用NSURLProtocol registerClass:didFinishLaunchingWithOption
3)阅读有关实施这些方法的文档: initWithRequest:cachedResponse:客户:, startLoading, URLProtocol:didReceiveResponse:cacheStoragePolicy: URLProtocolDidFinishLoading:
答案 1 :(得分:0)
按钮中的相对链接无法使用,因为链接的页面位于远程服务器上,而不在设备的文件系统上。但是,您可以使用UIWebViewDelegate方法使其工作:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if (navigationType == UIWebViewNavigationTypeLinkClicked) {
NSString *localRootPath = [NSString stringWithFormat:@"file://%@", [[NSBundle mainBundle] bundlePath]];
NSString *remoteRootPath = @"http://yourdomain.com";
NSString *remotePath = [[request.URL absoluteString] stringByReplacingOccurrencesOfString:localRootPath withString:remoteRootPath];
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:remotePath]]];
// or you can use your own loading mechanism here
return NO;
}
return YES;
}
此方法拦截来自WebView的所有请求。如果请求是由用户点击/单击触发,则会将URL从相对URL修改为绝对URL,以便可以从服务器加载URL。不要忘记在WebView上设置委托,否则不会调用此方法。