ローカルHTMLファイルをUIWebViewにロードする方法


165

HTMLファイルをUIWebViewにロードしようとしていますが、機能しません。これがステージです。プロジェクトにhtml_filesというフォルダがあります。次に、インターフェイスビルダーでwebViewを作成し、viewControllerでそれにアウトレットを割り当てました。これは、htmlファイルを追加するために使用しているコードです。

-(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];
}

これは機能せず、UIWebViewは空白です。私はいくつかの助けに感謝します。

回答:


272

おそらく次のようにNSStringを使用してhtmlドキュメントをロードする方が良いでしょう:

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]];

迅速

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

Swift 3にはいくつかの変更点があります。

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

試しましたか?

また、リソースがpathForResource:ofType:inDirectory呼び出しによって検出されたことを確認してください。


うまくいきませんでした。NSLog(@ "%@"、htmlFile)を実行しました。チェックするだけでnullと表示されます。
madcoderz 2011

つまり、リソースが見つかりません。次のものだけで確認してください:NSString * htmlFile = [[NSBundle mainBundle] pathForResource:@ "sample" ofType:@ "html"]; inDirectoryなし
user478681

inDirectoryがなければ、次のようになりました:iPhone Simulator / 4.3.2 / Applications / 49351078-9423-4A24-8E58-B2A059961097 / WebviewTest.app / sample.htmlしかし、HTMLが画面に表示されず、まだ空でした。他に何か不足していますか?サンプルプロジェクトは次のとおりです。http
//www.box.net/shared/rb05b4ppjnbof1r33gh7

3
あなたはあなたのWebviewのフレームを修正する必要があるだけです
user478681

3
この回答には多くの票がありますが、古くなっているようです。この方法では、ローカル画像とCSSアセットは読み込まれません。代わりにこの回答をご覧ください。
paulmelnikow 14

90

EDIT 2016年5月27日 - loadRequest露出する「ユニバーサルクロスサイトスクリプティングの脆弱性。」ロードするすべてのアセットを所有していることを確認してください。悪いスクリプトをロードすると、必要なものは何でもロードできます。

ローカルで作業するために相対リンクが必要な場合は、これを使用します。

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

バンドルは、プロジェクトのすべてのサブディレクトリを検索して見つけます my.html。(ディレクトリ構造はビルド時にフラット化されます)

my.htmlタグがの場合<img src="some.png">、webViewはsome.pngプロジェクトから読み込まれます。


4
このページで承認された答えを得ることができませんでした-しかし、このアプローチは初めて機能しました。iOSは最初の答えから進んだと思います。ありがとう。
ジェームズ

この回答をありがとう。これと受け入れられた回答の違いは、HTMLドキュメントのリンクです。
エイミー

2
アップルによると 、セキュリティ攻撃に対する脆弱性を回避するには、loadHTMLString:baseURL:を使用してローカルのHTMLファイルをロードしてください。loadRequest:は使用しないでください。
ED-209 2016年

受け入れられた答えは私のために働いていません。@neal Ehardt氏に感謝します。この回答は私にとって有効です。
Mihir Oza

これは、htmlファイルがどのフォルダー内にもない場合にのみ機能します
Renan Franca

40

これにより、プロジェクトのAssets(bundle)にあるhtmlファイルを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]]];

これはあなたにとって便利かもしれません。


それは私が唯一の違いをしているのと同じですが、プログラムでwebViewを作成しています。とにかくありがとう
madcoderz

NSLogによるHTMLファイルチェックのパスを取得します。
AJPatel 2011

HTMLファイルのターゲットメンバーシップを確認する必要があります。そうしないと、次の例外がスローされます:-キャッチされない例外 'NSInvalidArgumentException'によりアプリが終了します。理由: '***-[NSURL initFileURLWithPath:isDirectory:]:nil string parameter'
Durai Amuthan。 H

9

私はあなたがallocateあなたのwebview最初にする必要があると思います::

- (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];
}

8

簡単なコピーと貼り付けのコードスニペット:

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

注意:

HTMLファイルのターゲットメンバーシップがチェックされていることを確認してください。そうでない場合、次の例外がスローされます:-

ここに画像の説明を入力してください

キャッチされない例外によるアプリの終了

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


6

Swift 3および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)

これは、<img src = "..." />などのリンクされたファイルをロードしません
Pierre F

5
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]]];

4

同じコードが私のために働いているので、HTMLファイルがUTF-8エンコーディングをサポートしていない可能性があります。

または、次のコード行も使用できます。

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];

4

ここでは、JqueryでHTMLファイルを処理する方法を説明します。

 _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];

どちらかのリクエストを使用して、UIWebviewでHTMLファイルを呼び出すことができます


3

「html_files」がアプリのメインバンドルのディレクトリであり、Xcodeの単なるグループではないことを確認してください。


3

これを迅速に行う新しい方法。UIWebViewは廃止され、WKWebViewはWebページをロードするための新しいクラスです。これにより、Safariの機能がWebビューに確実に反映されます。

    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)

3
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)

3
[[NSBundle mainBundle] pathForResource:@"marqueeMusic" ofType:@"html"];

遅いかもしれませんが、からのファイルの場合は、に追加する必要pathForResourceがありnilますBuild Phases > Copy Bundle Resources

ここに画像の説明を入力してください


2

これが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 _ {
        }
    }

1
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 _ {
    }
}

0

Swift 2.0では、@ user478681の回答は次のようになります。

    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)

:より良い使用へのパス/いいえファイルにエラーに対してテストをしましょう
ingconti

0

すべてのファイル(htmlおよびリソース)をディレクトリ(私の「手動」用)に置きます。次に、ディレクトリを「サポートファイル」の上にXCodeにドラッグアンドドロップします。[必要に応じてアイテムをコピーする]オプションと[フォルダー参照を作成する]オプションをオンにする必要があります。次に、簡単なコードを記述します。

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

への注意@"manual/index"マニュアルは私のディレクトリの名前です!! それがすべてです!!!! 英語が下手でごめんなさい...

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

Hola desdeコスタリカ。Ponga los archivos(html ydemásrecursos)en un directorio(en mi caso lollamémanual)、luego、arrastre y suelte en XCode、sobre "Supporting Files"。使用されたdebe seleccionar las opciones「必要に応じてアイテムをコピーする」y「フォルダ参照を作成する」。

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

Prestaatencióna @"manual/index"manual es el nombre de mi directorio !!


0

プロジェクトが大きくなると、HTMLページがサブフォルダーにあるファイルを参照できるように、いくつかの構造が必要になる場合があります。

html_filesフォルダーをXcodeにドラッグし、[ フォルダー参照作成]オプションを選択すると、次のSwiftコードによりWKWebView、結果のフォルダー構造もサポートされます。

import WebKit

@IBOutlet weak var webView: WKWebView!

if let path = Bundle.main.path(forResource: "sample", ofType: "html", inDirectory: "html_files") {
    webView.load( URLRequest(url: URL(fileURLWithPath: path)) )
}

つまり、sample.htmlファイルに<img src="subfolder/myimage.jpg">タグが含まれている場合、画像ファイルmyimage.jpgsubfolderも読み込まれて表示されます。

クレジット:https : //stackoverflow.com/a/8436281/4769344

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.