Загружать ресурсы из относительного пути, используя локальный html в uiwebview - PullRequest
120 голосов
/ 21 июня 2011

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

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

Я загружаю этот файл test.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-файлов, которые я хочу загрузить в веб-просмотр, и я хотел бы, чтобы у меня не было всего в корне, и мне нужно изменить все ссылки в моем Интернете. приложение.

Ответы [ 8 ]

285 голосов
/ 08 декабря 2011

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

  1. Перетащите ресурс в ваш проект xcode (я перетащил папку с именем www из моего окна поиска), вы получите две опции: «создать группы для любых добавленных папок» и «создать ссылки на папки для любых добавленных папок».
  2. Выберите параметр «создать ссылки на папку».
  3. Используйте приведенный ниже код. Это должно работать как шарм.

    NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"www"]];<br> [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)) )
    }
24 голосов
/ 05 октября 2014

В Свифт:

 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)
}
5 голосов
/ 16 ноября 2013

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

    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 голосов
/ 21 июня 2011

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

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" 
                                                                                                         ofType:@"html"]
                                                             isDirectory:NO]]];         
2 голосов
/ 10 декабря 2015

Быстрый ответ 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)
0 голосов
/ 22 ноября 2016

В 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.

0 голосов
/ 30 сентября 2016

@ 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)
0 голосов
/ 27 июня 2011

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

<img src="myimage.png" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...