Загрузка ресурсов из относительного пути с помощью локального html в uiwebview



у меня есть очень простое iOS приложение с uiwebview загружает очень простую тестовую страницу (тест.html):



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


я загружаю этот тест.html-файл в моем веб-представлении:



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


это отлично работает, если я ссылаюсь на изображение без относительного пути и помещаю ссылочное изображение в корневой путь под Targets -> Copy Bundle Resources в XCode, однако я не могу заставить его работать с относительным путем, как показано в моем html-файле. Там должен быть способ сделать это, у меня много изображения, css, javascript файлы, которые я хочу загрузить в webview, и я хотел бы не иметь все в корне и должны изменить все ссылки в моем веб-приложении.

642   8  

8 ответов:

Это-как загрузить/использовать локальный HTML с относительными ссылками.

  1. перетащите ресурс в свой проект xcode (я перетащил папку с именем www из окна моего finder), вы получите два варианта "создать группы для любых добавленных папок" и "создать ссылки на папки для любых добавленных папок".
  2. выберите "Создать папку "ссылки".." опцион.
  3. используйте приведенный ниже код. Он должен работать как обаяние.

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

теперь все ваши относительные ссылки(например, img/.gif, js/.js)в html должно быть разрешено.

Swift 3

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

В 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)
}

Я втиснул все в одну строку (плохо я знаю) и не имел никаких проблем с этим:

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

Я просто делаю это:

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

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

где индекс".html " относительно ссылок на изображения, CSS, javascript и др.

быстрый ответ 2.

на Ссылка На Класс UIWebView советует не использовать webView.loadRequest(запрос):

Не используйте этот метод для загрузки локальных HTML-файлов; вместо этого используйте loadHTMLString: baseURL:.

в этом решении html считывается в строку. Url-адрес html используется для разработки пути и передает его в качестве базового 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)

Я вернулся и протестировал и повторно протестировал это, похоже, что единственный способ заставить его работать (так как у меня есть некоторые файлы в папке img и некоторые в js/css и т. д...) не использовать относительный путь к моему изображению в html и иметь все ссылки на папку bundle. Какой позор :(.

<img src="myimage.png" />

ответ @ sdbrain в Swift 3:

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

в Swift 3.01 с помощью WKWebView:

let localURL = URL.init(fileURLWithPath: Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "CWP")!)
myWebView.load(NSURLRequest.init(url: localURL) as URLRequest)

это настраивает для некоторых более тонких изменений синтаксиса в 3.01 и сохраняет структуру каталогов на месте, чтобы вы могли вставлять связанные HTML-файлы.

Comments

    Ничего не найдено.