2

我正在开发一个 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 加载新的网页 URL 就像它会如果我使用了 loadRequest 方法。

我的问题是如何让 UIWebView 表现得像它正在加载请求,同时仍然从 baseurl 注入本地文件?

谢谢

4

2 回答 2

0

NSURLPRotocol 是 NSURLConnection 的处理程序,它将让您有机会拦截对服务器的调用并替换您自己的内容。

1) 从 NSURlProtocol 派生一个类

2) 调用 NSURLProtocol registerClass: 在你的应用程序中:didFinishLaunchingWithOption

3) 根据需要阅读有关实现这些方法的文档:initWithRequest:cachedResponse:client:, startLoading, URLProtocol:didReceiveResponse:cacheStoragePolicy: URLProtocolDidFinishLoading:

于 2012-06-05T15:09:49.373 回答
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,以便可以从服务器加载。不要忘记在 WebView 上设置委托,否则将不会调用此方法。

于 2012-06-06T07:45:26.460 回答