0

我正在将远程网页加载到依赖于 js 和 css 资产的 iOS webview 中。为了提高性能,特别是在 3G 网络上,我希望将这些资产从本地文件调用到 iOS 设备。

支持 iOS 应用的网站也被手机浏览器使用,而不仅仅是 iOS 应用,因此子类化 NSURLRequest 来注册我自己的 URL 前缀 (myurl://) 并不理想。

我已经有代码为我的域之外的 URL 启动 mobileSafari:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSURL *url = [request URL];
    NSString *hostname = [url host];

    if (![hostname hasSuffix:@".mysite.com"] && navigationType == UIWebViewNavigationTypeLinkClicked) {
        [[UIApplication sharedApplication] openURL:url];
        return NO;
    }
    return YES;
}

这个方法是从同一个控制器实现中调用的,代码如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    // ...
    webView.delegate = self;

    // ...

        NSURL *url = [[NSURL alloc] initWithString:([path length] > 0 ? path : @"http://mysite.com/mobile/index")];
        NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
        [webView loadRequest:request];

    // ...

}

我已经查看了其他几个问题(如何使用带有引用本地图像的外部 HTML 的 iPhone webView?、在本地缓存不起作用的 UIWebView 中动态加载 javascript 文件、带有本地图像文件的 iOS WebView 远程 html在iPhone webview)但他们似乎都错过了我的问题的一个关键因素。

第一个链接有一些有希望的开始:

if ([url isEqualToString:@"http://path-to-cdn.com/jquery-1.8.2.min.js"]) {
    fileToLoad = [[NSBundle mainBundle] pathForResource:@"jquery-1.8.2.min" ofType:@"js"];
}

如果这是一种明智的方法,我会坚持如何将 fileToLoad NSBundle 传递到 webView 的 loadRequest 中,因为它需要一个 URL。

4

1 回答 1

0

在意识到我可以使用 stringByAppendingPathComponent 的输出作为 URL 之后,我认为我走在了正确的道路上,就像这样......

if (![hostname hasSuffix:@".mysite.com"] && navigationType == UIWebViewNavigationTypeLinkClicked) {

    NSString *urlString = [url absoluteString];
    if ([urlString isEqualToString:@"http://path-to-cdn.com/jquery-1.8.2.min.js"]) {
        NSString *tempurl = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"js/jquery-1.8.2.min.js"];
        [webView loadRequest:[NSMutableURLRequest requestWithURL:tempurl]];
    } else {
        [[UIApplication sharedApplication] openURL:url];
    }
    return NO;
}
return YES;

我还没有让它工作(它仍在加载远程 URL),但我认为我走在正确的道路上。

于 2012-10-17T17:21:25.930 回答