Загружать ресурсы из относительного пути, используя локальный html в uiwebview

У меня очень простое приложение 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];

Это работает отлично, если я ссылаюсь на изображение без относительного пути и помещаю связанное изображение в корневой путь в разделе Цели → Скопировать ресурсы Bundle в XCode, однако я не могу заставить его работать с относительным путем, как показано в мой html файл. Должен быть способ сделать это, у меня много изображений, css, javascript файлов, которые я хочу загрузить в webview, и я бы не хотел, чтобы все было в корне и мне пришлось менять все ссылки в моей сети приложение.

Ответ 1

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

  • Перетащите ресурс в проект xcode (я перетащил папку с именем www из окна Finder), вы получите две опции: "создать группы для любых добавленных папок" и "создать ссылки на папки для любых добавленных папок".
  • Выберите опцию "create folder references..".
  • Используйте приведенный ниже код. Он должен работать как шарм.

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

Ответ 2

В Swift:

func pathForResource (имя: String?, ofType ext: String?, inDirectory subpath: String?) → String?
- имя: Название Hmtl; - расширение ofType ext: для типа файла. В этом случае "html",
- в подкаталоге inDirectory: папка, где находится файл. В этом случае файл находится в корневой папке;

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

    webView.loadRequest(request)

Ответ 3

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

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

Ответ 4

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

    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

Быстрый ответ 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)

Ответ 6

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

<img src="myimage.png" />

Ответ 7

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

Ответ 8

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