Загрузка ресурсов из относительного пути с помощью локального 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, и я хотел бы не иметь все в корне и должны изменить все ссылки в моем веб-приложении.
8 ответов:
Это-как загрузить/использовать локальный HTML с относительными ссылками.
- перетащите ресурс в свой проект xcode (я перетащил папку с именем www из окна моего finder), вы получите два варианта "создать группы для любых добавленных папок" и "создать ссылки на папки для любых добавленных папок".
- выберите "Создать папку "ссылки".." опцион.
используйте приведенный ниже код. Он должен работать как обаяние.
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