iOS WebView remote html with local image files

后端 未结 5 551
刺人心
刺人心 2020-11-28 17:30

Similar questions have been asked before, but I could never find a solution.

Here is my situation - my UIWebView loads a remote html page. The images used in the web

5条回答
  •  温柔的废话
    2020-11-28 17:56

    NSURLProtocol is a good choice for UIWebView, but until now the WKWebView still not support it. For WKWebView we can build a local HTTP server to handle the local file request, the GCDWebServer is good for this:

    self.webServer = [[GCDWebServer alloc] init];
    
    [self.webServer addDefaultHandlerForMethod:@"GET"
                                  requestClass:[GCDWebServerRequest class]
                                  processBlock:
     ^GCDWebServerResponse *(GCDWebServerRequest *request)
    {
        NSString *fp = request.URL.path;
    
        if([[NSFileManager defaultManager] fileExistsAtPath:fp]){
            NSData *dt = [NSData dataWithContentsOfFile:fp];
    
            NSString *ct = nil;
            NSString *ext = request.URL.pathExtension;
    
            BOOL (^IsExtInSide)(NSArray *) = ^(NSArray *pool){
                NSUInteger index = [pool indexOfObjectWithOptions:NSEnumerationConcurrent
                                                      passingTest:^BOOL(NSString *obj, NSUInteger idx, BOOL *stop) {
                                                          return [ext caseInsensitiveCompare:obj] == NSOrderedSame;
                                                      }];
                BOOL b = (index != NSNotFound);
                return b;
            };
    
            if(IsExtInSide(@[@"jpg", @"jpeg"])){
                ct = @"image/jpeg";
            }else if(IsExtInSide(@[@"png"])){
                ct = @"image/png";
            }
            //else if(...) // other exts
    
            return [GCDWebServerDataResponse responseWithData:dt contentType:ct];
    
        }else{
            return [GCDWebServerResponse responseWithStatusCode:404];
        }
    
    }];
    
    [self.webServer startWithPort:LocalFileServerPort bonjourName:nil];
    

    When specify the file path of the local file, add the local server prefix:

    NSString *fp = [[NSBundle mainBundle] pathForResource:@"picture" ofType:@"jpg" inDirectory:@"www"];
    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://127.0.0.1:%d%@", LocalFileServerPort, fp]];
    NSString *str = url.absoluteString;
    [self.webViewController executeJavascript:[NSString stringWithFormat:@"updateLocalImage('%@')", str]];
    

提交回复
热议问题