web-dev-qa-db-ja.com

uiwebviewでローカルhtmlを使用して相対パスからリソースをロードする

私は、非常に単純なテストページ(test.html)を読み込むuiwebviewを持つ非常に単純なiOSアプリを持っています。

<html>
<body>
<img src="img/myimage.png" />
</body>
</html>

このtest.htmlファイルをWebビューにロードします。

NSURL *url = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"html"];
NSString *html = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSURL *baseUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
[webView loadHTMLString:html baseURL:baseUrl];

相対パスなしで画像を参照し、XCode内のターゲット->バンドルリソースのコピーのルートパスに参照画像を配置した場合、これは正常に機能しますが、htmlファイルに示されているように相対パスで動作することはできません。これを行う方法があるはずです、私はウェブビューにロードしたいたくさんの画像、CSS、javascriptファイルがあり、すべてをルートに持っている必要はなく、ウェブのすべての参照を変更する必要がありますアプリ。

120
Matt Palmerlee

これは、相対参照を使用してローカルhtmlをロード/使用する方法です。

  1. リソースをxcodeプロジェクトにドラッグします(Finderウィンドウからwwwという名前のフォルダーをドラッグしました)。「追加したフォルダーのグループを作成する」と「追加したフォルダーのフォルダー参照を作成する」の2つのオプションがあります。
  2. 「フォルダ参照を作成します。」オプションを選択します。
  3. 以下のコードを使用してください。それは魅力のように動作するはずです。

    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"www"]];
    [webview loadRequest:[NSURLRequest requestWithURL:url]];

これで、html内のすべての相対リンク(img /。gif、js /。jsなど)が解決されます。

Swift

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

Swiftの場合:

 func pathForResource(  name: String?, 
                        ofType ext: String?, 
                        inDirectory subpath: String?) -> String?  {

  // **name:** Name of Hmtl
  // **ofType ext:** extension for type of file. In this case "html"
  // **inDirectory subpath:** the folder where are the file. 
  //    In this case the file is in root folder

    let path = NSBundle.mainBundle().pathForResource(             "dados",
                                                     ofType:      "html", 
                                                     inDirectory: "root")
    var requestURL = NSURL(string:path!)
    var request = NSURLRequest(URL:requestURL)

    webView.loadRequest(request)
}
24
Weles

私は単にこれを行います:

    UIWebView *webView = [[[UIWebView alloc] init] autorelease];

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

「index.html」は、画像、CSS、javascriptなどを相対的に参照します。

5
Old McStopher

私はすべてを1行に詰め込んで(悪いことは知っています)、問題はありませんでした。

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" 
                                                                                                         ofType:@"html"]
                                                             isDirectory:NO]]];         
5
PengOne

迅速な回答2。

IWebView Class Reference は、webView.loadRequest(request)の使用を推奨しません。

このメソッドを使用してローカルHTMLファイルをロードしないでください。代わりに、loadHTMLString:baseURL:を使用します。

このソリューションでは、htmlが文字列に読み込まれます。 htmlのURLはパスを計算するために使用され、ベースURLとして渡します。

let url = bundle.URLForResource("index", withExtension: "html", subdirectory: "htmlFileFolder")
let html = try String(contentsOfURL: url)
let base = url.URLByDeletingLastPathComponent
webView.loadHTMLString(html, baseURL: base)
2
ThisIsNotMe

私は戻ってこれをテストし、再テストしましたが、それを動作させる唯一の方法は(imgフォルダにいくつかのファイルがあり、js/cssなどにいくつかあるため)... HTML内の画像への相対パスを使用し、すべてがバンドルフォルダーを参照するようにします。残念だ :(。

<img src="myimage.png" />
0
Matt Palmerlee

Swift 3の@sdbrainの回答:

    let url = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "www")!)
    webView.loadRequest(NSURLRequest.init(url: url) as URLRequest)
0
skornos