How to load local html file into UIWebView

I’m trying to load a html file into my UIWebView but it won’t work. Here’s the stage: I have a folder called html_files in my project. Then I created a webView in interface builder and assigned an outlet to it in the viewController. This is the code I’m using to append the html file:

-(void)viewDidLoad
{
    NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"html" inDirectory:@"html_files"];
    NSData *htmlData = [NSData dataWithContentsOfFile:htmlFile];
    [webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];
    [super viewDidLoad];
}

That won’t work and the UIWebView is blank. I’d appreciate some help.

  • What is the most efficient way to sync Core Data with JSON API
  • Is there a simple way to format currency into string in iOS?
  • problem in changing size of uialertview
  • Attach a photo to an email from my iPhone application
  • orientation incorrectly reported in viewDidLoad
  • UITextField Only Top And Bottom Border
  • 17 Solutions Collect From Internet About “How to load local html file into UIWebView”

    probably it is better to use NSString and load html document as follows:

    Objective-C

    NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"html"];
    NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil];
    [webView loadHTMLString:htmlString baseURL: [[NSBundle mainBundle] bundleURL]];
    

    Swift

    let htmlFile = NSBundle.mainBundle().pathForResource("fileName", ofType: "html")
    let html = try? String(contentsOfFile: htmlFile!, encoding: NSUTF8StringEncoding)
    webView.loadHTMLString(html!, baseURL: nil) 
    

    Swift 3 has few changes:

    let htmlFile = Bundle.main.path(forResource: "intro", ofType: "html")
    let html = try? String(contentsOfFile: htmlFile!, encoding: String.Encoding.utf8)
    webView.loadHTMLString(html!, baseURL: nil)
    

    Did you try?

    Also check that the resource was found by pathForResource:ofType:inDirectory call.

    EDIT 2016-05-27loadRequest exposes “a universal Cross-Site Scripting vulnerability.” Make sure you own every single asset that you load. If you load a bad script, it can load anything it wants.

    If you need relative links to work locally, use this:

    NSURL *url = [[NSBundle mainBundle] URLForResource:@"my" withExtension:@"html"];
    [webView loadRequest:[NSURLRequest requestWithURL:url]];
    

    The bundle will search all subdirectories of the project to find my.html. (the directory structure gets flattened at build time)

    If my.html has the tag <img src="some.png">, the webView will load some.png from your project.

    by this you can load html file which is in your project Assets(bundle) to webView.

     UIWebView *web = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
        [web loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] 
                                    pathForResource:@"test" ofType:@"html"]isDirectory:NO]]];
    

    may be this is useful to you.

    I guess you need to allocate and init your webview first::

    - (void)viewDidLoad
    {
        NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"sample" ofType:@"html" inDirectory:@"html_files"];
        NSData *htmlData = [NSData dataWithContentsOfFile:htmlFile];
        webView = [[UIWebView alloc] init];
        [webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];
    
        [super viewDidLoad];
    }
    

    A Simple Copy-Paste code snippet:

    -(void)LoadLocalHtmlFile:(NSString *)fileName onWebVu:(UIWebView*)webVu
    {
        [webVu loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:fileName ofType:@"html"]isDirectory:NO]]];
    }
    

    Note:

    Make sure the html file’s Target membership is checked otherwise following exception will get thrown :-

    enter image description here

    Terminating app due to uncaught exception

    'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:isDirectory:]: nil string parameter'

    UIWebView *web=[[UIWebView alloc]initWithFrame:self.view.frame];
        //[self.view addSubview:web];
        NSString *filePath=[[NSBundle mainBundle]pathForResource:@"browser_demo" ofType:@"html" inDirectory:nil];
        [web loadRequest:[NSURLRequest requestWhttp://stackoverflow.com/review/first-postsithURL:[NSURL fileURLWithPath:filePath]]];
    

    May be your HTML file doesn’t support UTF-8 encoding, because the same code is working for me.

    Or u can also these line of code:

    NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"Notes For Apple" ofType:@"htm" inDirectory:nil];
    NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:nil];
    [WebView loadHTMLString:htmlString baseURL:nil];
    

    Here the way the working of HTML file with Jquery.

     _webview=[[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 320, 568)];
        [self.view addSubview:_webview];
    
        NSString *filePath=[[NSBundle mainBundle]pathForResource:@"jquery" ofType:@"html" inDirectory:nil];
    
        NSLog(@"%@",filePath);
        NSString *htmlstring=[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    
        [_webview loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:filePath]]];
                             or
        [_webview loadHTMLString:htmlstring baseURL:nil];
    

    You can use either the requests to call the HTML file in your UIWebview

    Make sure “html_files” is a directory in your app’s main bundle, and not just a group in Xcode.

    A new way to do this using swift. The UIWebView is no more and WKWebView is the new class to load web pages, which ensures the Safari features to the web view.

        import WebKit
    
        let preferences = WKPreferences()
        preferences.javaScriptCanOpenWindowsAutomatically = false
    
        let configuration = WKWebViewConfiguration()
        configuration.preferences = preferences
    
        let webView = WKWebView(frame: self.view.bounds, configuration: configuration)
        let request = NSURLRequest(URL: NSURL(string: "http://nshipster.com"))
        webView.loadRequest(request)
    
    Swift iOS:
    
     // get server url from the plist directory
            var htmlFile = NSBundle.mainBundle().pathForResource("animation_bg", ofType: "html")!
            var htmlString = NSString(contentsOfFile: htmlFile, encoding: NSUTF8StringEncoding, error: nil)
            self.webView.loadHTMLString(htmlString, baseURL: nil)
    
    [[NSBundle mainBundle] pathForResource:@"marqueeMusic" ofType:@"html"];
    

    It may be late but if the file from pathForResource is nil you should add it in the Build Phases > Copy Bundle Resources.

    enter image description here

    For Swift 3 and Swift 4:

    let htmlFile = Bundle.main.path(forResource: "name_resource", ofType: "html")
    let html = try! String(contentsOfFile: htmlFile!, encoding: String.Encoding.utf8)
    self.webView.loadHTMLString(html, baseURL: nil)
    

    Here’s Swift 3:

        if let htmlFile = Bundle.main.path(forResource: "aa", ofType: "html"){
            do{
                let htmlString = try NSString(contentsOfFile: htmlFile, encoding:String.Encoding.utf8.rawValue )
                messageWebView.loadHTMLString(htmlString as String, baseURL: nil)
            }
            catch _ {
            }
        }
    
    if let htmlFile = NSBundle.mainBundle().pathForResource("aa", ofType: "html"){
        do{
            let htmlString = try NSString(contentsOfFile: htmlFile, encoding:NSUTF8StringEncoding )
            webView.loadHTMLString(htmlString as String, baseURL: nil)
        }
        catch _ {
        }
    }
    

    In Swift 2.0, @user478681’s answer might look like this:

        let HTMLDocumentPath = NSBundle.mainBundle().pathForResource("index", ofType: "html")
        let HTMLString: NSString?
    
        do {
            HTMLString = try NSString(contentsOfFile: HTMLDocumentPath!, encoding: NSUTF8StringEncoding)
        } catch {
            HTMLString = nil
        }
    
        myWebView.loadHTMLString(HTMLString as! String, baseURL: nil)
    

    Put all the files (html and resources)in a directory (for my “manual”). Next, drag and drop the directory to XCode, over “Supporting Files”. You should check the options “Copy Items if needed” and “Create folder references”. Next, write a simple code:

    NSURL *url = [[NSBundle mainBundle] URLForResource:@"manual/index" withExtension:@"html"];
    [myWebView loadRequest:[NSURLRequest requestWithURL:url]];
    

    Attention to @"manual/index", manual is the name of my directory!!
    It’s all!!!! Sorry for my bad english…

    =======================================================================

    Hola desde Costa Rica. Ponga los archivos (html y demás recursos) en un directorio (en mi caso lo llamé manual), luego, arrastre y suelte en XCode, sobre “Supporting Files”. Usted debe seleccionar las opciones “Copy Items if needed” y “Create folder references”.

    NSURL *url = [[NSBundle mainBundle] URLForResource:@"manual/index" withExtension:@"html"];
    [myWebView loadRequest:[NSURLRequest requestWithURL:url]];
    

    Presta atención a @"manual/index", manual es el nombre de mi directorio!!